private static void TestEdgeLimitsCommonImpl( VertexConstraints constraint1, VertexConstraints constraint2, out Range lengthRange, out Range angleRange) { BoxSetLengthAngleConstraints lengthAngleConstraints = BoxSetLengthAngleConstraints.FromVertexConstraints(constraint1, constraint2, 3, 0); GeneralizedDistanceTransform2D transform = new GeneralizedDistanceTransform2D( new Range(0, 35), new Range(-Math.PI * 2, Math.PI * 2), new Size(2000, 2000)); AllowedLengthAngleChecker allowedLengthAngleChecker = new AllowedLengthAngleChecker(constraint1, constraint2, transform, 1, 0); lengthRange = lengthAngleConstraints.LengthBoundary; angleRange = lengthAngleConstraints.AngleBoundary; const int insideCheckCount = 1000; for (int i = 0; i < insideCheckCount; ++i) { Vector edgePoint1 = constraint1.MinCoord + new Vector( Random.Double() * (constraint1.MaxCoord.X - constraint1.MinCoord.X), Random.Double() * (constraint1.MaxCoord.Y - constraint1.MinCoord.Y)); Vector edgePoint2 = constraint2.MinCoord + new Vector( Random.Double() * (constraint2.MaxCoord.X - constraint2.MinCoord.X), Random.Double() * (constraint2.MaxCoord.Y - constraint2.MinCoord.Y)); Vector vec = edgePoint2 - edgePoint1; double length = vec.Length; double angle = Vector.AngleBetween(Vector.UnitX, vec); const double tolerance = 1e-10; Assert.IsTrue(lengthAngleConstraints.InRange(length, tolerance, angle, tolerance)); Assert.IsTrue(lengthAngleConstraints.OverallRange.InRange(length, tolerance, angle, tolerance)); Assert.IsTrue(allowedLengthAngleChecker.IsAllowed(length, angle)); } const int outsideCheckCount = 1000; for (int i = 0; i < outsideCheckCount; ++i) { Vector edgePoint1 = constraint1.MinCoord + new Vector( (Random.Double() * 2 - 0.5) * (constraint1.MaxCoord.X - constraint1.MinCoord.X), (Random.Double() * 2 - 0.5) * (constraint1.MaxCoord.Y - constraint1.MinCoord.Y)); Vector edgePoint2 = constraint2.MinCoord + new Vector( (Random.Double() * 2 - 0.5) * (constraint2.MaxCoord.X - constraint2.MinCoord.X), (Random.Double() * 2 - 0.5) * (constraint2.MaxCoord.Y - constraint2.MinCoord.Y)); Vector vec = edgePoint2 - edgePoint1; double length = vec.Length; double angle = Vector.AngleBetween(Vector.UnitX, vec); // We've generated too long edge if (length > transform.RangeX.Right) { continue; } bool definitelyOutside = !lengthAngleConstraints.OverallRange.InRange(length, 1e-6, angle, 1e-6); Assert.IsTrue(!definitelyOutside || !allowedLengthAngleChecker.IsAllowed(length, angle)); Assert.IsTrue(!definitelyOutside || !lengthAngleConstraints.InRange(length, 1e-6, angle, 1e-6)); } }
private static void TestEdgeLimitsCommonImpl( VertexConstraints constraint1, VertexConstraints constraint2, out Range lengthRange, out Range angleRange) { BoxSetLengthAngleConstraints lengthAngleConstraints = BoxSetLengthAngleConstraints.FromVertexConstraints(constraint1, constraint2, 3, 0); GeneralizedDistanceTransform2D transform = new GeneralizedDistanceTransform2D( new Range(0, 35), new Range(-Math.PI * 2, Math.PI * 2), new Size(2000, 2000)); AllowedLengthAngleChecker allowedLengthAngleChecker = new AllowedLengthAngleChecker(constraint1, constraint2, transform, 1, 0); lengthRange = lengthAngleConstraints.LengthBoundary; angleRange = lengthAngleConstraints.AngleBoundary; const int insideCheckCount = 1000; for (int i = 0; i < insideCheckCount; ++i) { Vector edgePoint1 = constraint1.MinCoord + new Vector( Random.Double() * (constraint1.MaxCoord.X - constraint1.MinCoord.X), Random.Double() * (constraint1.MaxCoord.Y - constraint1.MinCoord.Y)); Vector edgePoint2 = constraint2.MinCoord + new Vector( Random.Double() * (constraint2.MaxCoord.X - constraint2.MinCoord.X), Random.Double() * (constraint2.MaxCoord.Y - constraint2.MinCoord.Y)); Vector vec = edgePoint2 - edgePoint1; double length = vec.Length; double angle = Vector.AngleBetween(Vector.UnitX, vec); const double tolerance = 1e-10; Assert.IsTrue(lengthAngleConstraints.InRange(length, tolerance, angle, tolerance)); Assert.IsTrue(lengthAngleConstraints.OverallRange.InRange(length, tolerance, angle, tolerance)); Assert.IsTrue(allowedLengthAngleChecker.IsAllowed(length, angle)); } const int outsideCheckCount = 1000; for (int i = 0; i < outsideCheckCount; ++i) { Vector edgePoint1 = constraint1.MinCoord + new Vector( (Random.Double() * 2 - 0.5) * (constraint1.MaxCoord.X - constraint1.MinCoord.X), (Random.Double() * 2 - 0.5) * (constraint1.MaxCoord.Y - constraint1.MinCoord.Y)); Vector edgePoint2 = constraint2.MinCoord + new Vector( (Random.Double() * 2 - 0.5) * (constraint2.MaxCoord.X - constraint2.MinCoord.X), (Random.Double() * 2 - 0.5) * (constraint2.MaxCoord.Y - constraint2.MinCoord.Y)); Vector vec = edgePoint2 - edgePoint1; double length = vec.Length; double angle = Vector.AngleBetween(Vector.UnitX, vec); // We've generated too long edge if (length > transform.RangeX.Right) continue; bool definitelyOutside = !lengthAngleConstraints.OverallRange.InRange(length, 1e-6, angle, 1e-6); Assert.IsTrue(!definitelyOutside || !allowedLengthAngleChecker.IsAllowed(length, angle)); Assert.IsTrue(!definitelyOutside || !lengthAngleConstraints.InRange(length, 1e-6, angle, 1e-6)); } }