/** * Test the getting the area of a self-intersecting polygon */ [Test] public void testSelfIntersecting() { IPoly p = new PolyDefault(); p.Add(6.0, 6.0); p.Add(2.0, 6.0); p.Add(2.0, 5.0); p.Add(4.0, 5.0); p.Add(4.0, 1.0); p.Add(2.0, 1.0); p.Add(2.0, 2.0); p.Add(1.0, 2.0); p.Add(1.0, 4.0); p.Add(2.0, 4.0); p.Add(2.0, 2.0); p.Add(3.0, 2.0); p.Add(3.0, 4.0); p.Add(2.0, 4.0); p.Add(2.0, 5.0); p.Add(0.0, 5.0); p.Add(0.0, 1.0); p.Add(2.0, 1.0); p.Add(2.0, 0.0); p.Add(6.0, 0.0); Assert.IsTrue(24.0 == p.GetArea()); }
/// <summary> /// Constructs a rectangle shape for GPC from the given /// bounds. /// </summary> public static IPoly CreateRectangle(RectangleF bounds) { IPoly rectangle = new PolyDefault(); rectangle.Add(bounds.Left, bounds.Top); rectangle.Add(bounds.Right, bounds.Top); rectangle.Add(bounds.Right, bounds.Bottom); rectangle.Add(bounds.Left, bounds.Bottom); return rectangle; }
// ------------- // --- Tests --- // ------------- /** * Test the equality operator when empty */ [Test] public void testEqualEmpty() { IPoly p0a = new PolyDefault(); IPoly p0b = new PolyDefault(); Assert.IsTrue(p0a != p0b); Assert.AreEqual(p0a, p0b); Assert.AreEqual(p0b, p0a); Assert.AreEqual(p0a, p0a); }
/** * Test the getting the area of a triangle */ [Test] public void testAreaTriangle() { IPoly p = new PolyDefault(); p.Add(0.0, 0.0); p.Add(2.0, 0.0); p.Add(2.0, 2.0); Assert.IsTrue(2.0 == p.GetArea()); }
public void testAreaSquare() { IPoly p = new PolyDefault(); p.Add( 0.0, 0.0 ); p.Add( 2.0, 0.0 ); p.Add( 2.0, 2.0 ); p.Add( 0.0, 2.0 ); Assert.IsTrue( 4.0 == p.GetArea() ); }
/// <summary> /// Copy constructor that duplicates a polygon. /// </summary> public PolyDefault(PolyDefault poly) : this(poly.isHole) { // Copy the contents of the array for (int i = 0; i < poly.InnerPolygonCount; i++) { // Copy this polygon IPoly ip = poly.GetInnerPoly(i); m_List.Add(ip.Duplicate()); } }
public void testAreaNonConvex() { IPoly p = new PolyDefault(); p.Add( 0.0, 0.0 ); p.Add( 0.0, 8.0 ); p.Add( 6.0, 4.0 ); p.Add( 4.0, 2.0 ); p.Add( 2.0, 4.0 ); Assert.IsTrue( 20.0 == p.GetArea() ); }
/** * Test the getting the area of a non-convex polygon */ [Test] public void testAreaNonConvex() { IPoly p = new PolyDefault(); p.Add(0.0, 0.0); p.Add(0.0, 8.0); p.Add(6.0, 4.0); p.Add(4.0, 2.0); p.Add(2.0, 4.0); Assert.IsTrue(20.0 == p.GetArea()); }
/// <summary> /// Creates a polygon from the given list of points. /// </summary> private IPoly CreatePolygon(IList<PointF> points) { // Create the polygon PolyDefault pd = new PolyDefault(); // Go through the points foreach (PointF p in points) pd.Add(p.X, p.Y); // Return the results return pd; }
/// <summary> /// Translates the polygons and returns the results as a new /// polygon. /// </summary> public IPoly Translate(double dx, double dy) { // Create a new polygon PolyDefault poly = new PolyDefault(); // Go through the inner polygons for (int i = 0; i < InnerPolygonCount; i++) { // Create the new polygon list poly.m_List.Add(((IPoly)m_List[i]).Translate(dx, dy)); } // Return the results return(poly); }
public void TestIntersectionEmptySet() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 1.0, 0.0 ); p1.Add( 1.0, 1.0 ); p1.Add( 0.0, 1.0 ); IPoly p2 = new PolyDefault(); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 0.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 3.0 ); IPoly empty = Clipper.Intersection( p1, p2 ); Assert.IsTrue( empty.IsEmpty() ); }
/** * Test the equality operator when polys with different number of points */ [Test] public void testEqualDifferentNumPoints() { IPoly p1a = new PolyDefault(); p1a.Add(0.0, 0.0); p1a.Add(4.0, 0.0); IPoly p1b = new PolyDefault(); p1b.Add(0.0, 0.0); p1b.Add(4.0, 0.0); p1b.Add(4.0, 4.0); p1b.Add(0.0, 4.0); Assert.IsTrue(!p1a.Equals(p1b)); Assert.IsTrue(!p1b.Equals(p1a)); }
/** * Test the equality operator when same points but not it same order */ [Test] public void testEqualBadOrder() { IPoly p1a = new PolyDefault(); p1a.Add(0.0, 0.0); p1a.Add(4.0, 0.0); p1a.Add(4.0, 4.0); p1a.Add(0.0, 4.0); IPoly p1b = new PolyDefault(); p1b.Add(0.0, 0.0); p1b.Add(0.0, 4.0); p1b.Add(4.0, 0.0); p1b.Add(4.0, 4.0); Assert.IsTrue(!p1a.Equals(p1b)); Assert.IsTrue(!p1b.Equals(p1a)); }
/** * Test the equality operator when same but different order */ [Test] public void testEqualDifferentOrder() { IPoly p1a = new PolyDefault(); p1a.Add(0.0, 0.0); p1a.Add(4.0, 0.0); p1a.Add(4.0, 4.0); p1a.Add(0.0, 4.0); IPoly p1b = new PolyDefault(); p1b.Add(0.0, 4.0); p1b.Add(0.0, 0.0); p1b.Add(4.0, 0.0); p1b.Add(4.0, 4.0); Assert.IsTrue(p1a != p1b); Assert.AreEqual(p1a, p1b); Assert.AreEqual(p1b, p1a); }
/// <summary> /// Creates a standard circle with some point that /// approximates a circle. /// </summary> public static IPoly CreateCircle( PointF point, float radius) { // Create the polygon PolyDefault poly = new PolyDefault(); // Create the points by just going in a circle int points = 32; double angle = 0; for (int i = 0; i < points; i++) { poly.Add(new PointF( point.X + (float) Math.Cos(angle) * radius, point.Y + (float) Math.Sin(angle) * radius)); angle += Constants.PI2 / points; } // Return the results return poly; }
/** * Return true if the given object is equal to this one. */ public override bool Equals(Object obj) { // Don't bother if we aren't the same type of object if (!(obj is PolyDefault)) { return(false); } // Cast it to this object PolyDefault that = (PolyDefault)obj; // We need to have the same hole type if (this.isHole != that.isHole) { return(false); } // Go through the elements to match if (m_List.Count != that.m_List.Count) { return(false); } // Loop through and make sure each item is equal for (int i = 0; i < m_List.Count; i++) { IPoly p1 = (IPoly)m_List[i]; IPoly p2 = (IPoly)that.m_List[i]; if (!p1.Equals(p2)) { return(false); } } // We have a match return(true); }
/** * Test the getting the area of a polygon with a hole */ [Test] public void testAreaWithHole() { IPoly p1 = new PolyDefault(); p1.Add(0.0, 0.0); p1.Add(4.0, 0.0); p1.Add(4.0, 4.0); p1.Add(0.0, 4.0); IPoly p2 = new PolyDefault(true); p2.Add(1.0, 1.0); p2.Add(3.0, 1.0); p2.Add(3.0, 3.0); p2.Add(1.0, 3.0); IPoly p = new PolyDefault(); p.Add(p1); p.Add(p2); Assert.IsTrue(12.0 == p.GetArea()); }
public void TestUnionPolyOneOnTopOfTwo() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 4.0 ); p1.Add( 5.0, 4.0 ); p1.Add( 5.0, 9.0 ); p1.Add( 3.0, 7.0 ); p1.Add( 1.0, 9.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly exp1 = new PolyDefault(); exp1.Add( 0.0, 2.0 ); exp1.Add( 2.0, 0.0 ); exp1.Add( 3.0, 1.0 ); exp1.Add( 4.0, 0.0 ); exp1.Add( 6.0, 2.0 ); exp1.Add( 4.0, 4.0 ); exp1.Add( 5.0, 4.0 ); exp1.Add( 5.0, 9.0 ); exp1.Add( 3.0, 7.0 ); exp1.Add( 1.0, 9.0 ); exp1.Add( 1.0, 4.0 ); exp1.Add( 2.0, 4.0 ); IPoly exp2 = new PolyDefault(true); exp2.Add( 4.0, 4.0 ); exp2.Add( 3.0, 3.0 ); exp2.Add( 2.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( exp1 ); exp.Add( exp2 ); PolyDefault result = (PolyDefault)Clipper.Union( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestUnionTwoEqual() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 4.0, 0.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 0.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 0.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 0.0, 4.0 ); PolyDefault result = (PolyDefault)Clipper.Union( p1, p2 ); // result.print(); Assert.AreEqual( p1, result ); }
public void TestIntersectionTwoEqual() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 4.0, 0.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 0.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 0.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 0.0, 4.0 ); IPoly result = Clipper.Intersection( p1, p2 ); Assert.AreEqual( p1, result ); }
public void TestXorRectangleHole() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 1.0 ); p1.Add( 4.0, 1.0 ); p1.Add( 4.0, 5.0 ); p1.Add( 0.0, 5.0 ); IPoly p2 = new PolyDefault(true); p2.Add( 1.0, 2.0 ); p2.Add( 3.0, 2.0 ); p2.Add( 3.0, 4.0 ); p2.Add( 1.0, 4.0 ); IPoly p12 = new PolyDefault(); p12.Add( p1 ); p12.Add( p2 ); IPoly p3 = new PolyDefault(); p3.Add( 2.0, 0.0 ); p3.Add( 6.0, 0.0 ); p3.Add( 6.0, 6.0 ); p3.Add( 2.0, 6.0 ); // ----------------------------------------------------------- // --- This is not what I expected and it seems reasonable --- // --- However it could be wrong. --- // ----------------------------------------------------------- // --- I computed the area of this poly and it came out to --- // --- be 24 which is what you would expect. --- // ----------------------------------------------------------- IPoly exp = new PolyDefault(); exp.Add( 6.0, 6.0 ); exp.Add( 2.0, 6.0 ); exp.Add( 2.0, 5.0 ); exp.Add( 4.0, 5.0 ); exp.Add( 4.0, 1.0 ); exp.Add( 2.0, 1.0 ); exp.Add( 2.0, 2.0 ); exp.Add( 1.0, 2.0 ); exp.Add( 1.0, 4.0 ); exp.Add( 2.0, 4.0 ); exp.Add( 2.0, 2.0 ); exp.Add( 3.0, 2.0 ); exp.Add( 3.0, 4.0 ); exp.Add( 2.0, 4.0 ); exp.Add( 2.0, 5.0 ); exp.Add( 0.0, 5.0 ); exp.Add( 0.0, 1.0 ); exp.Add( 2.0, 1.0 ); exp.Add( 2.0, 0.0 ); exp.Add( 6.0, 0.0 ); PolyDefault result = (PolyDefault)Clipper.Xor( p12, p3 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestIntersectionRectInterSide4() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 1.0 ); p1.Add( 4.0, 1.0 ); p1.Add( 4.0, 5.0 ); p1.Add( 0.0, 5.0 ); IPoly p2 = new PolyDefault(); p2.Add( -1.0, 2.0 ); p2.Add( 1.0, 2.0 ); p2.Add( 1.0, 4.0 ); p2.Add( -1.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( 0.0, 2.0 ); exp.Add( 1.0, 2.0 ); exp.Add( 1.0, 4.0 ); exp.Add( 0.0, 4.0 ); IPoly result = Clipper.Intersection( p1, p2 ); Assert.AreEqual( exp, result ); }
public void TestUnionRectInterSide3() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 1.0 ); p1.Add( 4.0, 1.0 ); p1.Add( 4.0, 5.0 ); p1.Add( 0.0, 5.0 ); IPoly p2 = new PolyDefault(); p2.Add( 1.0, 4.0 ); p2.Add( 3.0, 4.0 ); p2.Add( 3.0, 6.0 ); p2.Add( 1.0, 6.0 ); IPoly exp = new PolyDefault(); exp.Add( 0.0, 1.0 ); exp.Add( 4.0, 1.0 ); exp.Add( 4.0, 5.0 ); exp.Add( 3.0, 5.0 ); exp.Add( 3.0, 6.0 ); exp.Add( 1.0, 6.0 ); exp.Add( 1.0, 5.0 ); exp.Add( 0.0, 5.0 ); PolyDefault result = (PolyDefault)Clipper.Union( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
/// <summary> /// Creates a polygon-based shape around a single point of a /// random size. The radiusMultiplier is used to increase the /// size to ensure that it connects to another shape (if that /// is the requirement). /// </summary> public static IPoly CreateShape( Junction parent, PointF point, float radius) { // Figure out the size of the square, as a radius. On each // retry, we make it a bit bigger. radius *= parent.Random.NextSingle(0.5f, 1.5f); // Get a random angle int count = parent.Random.Next(3, 7); float angle = parent.Random.NextSingle(0, Constants.PI2); // Create the square we are mapping PolyDefault poly = new PolyDefault(); for (int i = 0; i < count; i++) { poly.Add(new PointF( point.X + (float) Math.Cos(angle) * radius, point.Y + (float) Math.Sin(angle) * radius)); angle += Constants.PI2 / count; } // Return the results return poly; }
public void TestIntersectionPolyOneOnTopOfTwo() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 4.0 ); p1.Add( 5.0, 4.0 ); p1.Add( 5.0, 9.0 ); p1.Add( 3.0, 7.0 ); p1.Add( 1.0, 9.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly result = Clipper.Intersection( p1, p2 ); Assert.IsTrue( result.IsEmpty() ); }
public void TestIntersectionPolyFourSides() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 0.5 ); p1.Add( 5.0, 0.5 ); p1.Add( 5.0, 6.0 ); p1.Add( 3.0, 4.0 ); p1.Add( 1.0, 6.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( 1.0, 1.0 ); exp.Add( 1.5, 0.5 ); exp.Add( 2.5, 0.5 ); exp.Add( 3.0, 1.0 ); exp.Add( 3.5, 0.5 ); exp.Add( 4.5, 0.5 ); exp.Add( 5.0, 1.0 ); exp.Add( 5.0, 3.0 ); exp.Add( 4.0, 4.0 ); exp.Add( 3.0, 3.0 ); exp.Add( 2.0, 4.0 ); exp.Add( 1.0, 3.0 ); IPoly result = Clipper.Intersection( p1, p2 ); Assert.AreEqual( exp, result ); }
public void TestXorSeparate() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 1.0, 0.0 ); p1.Add( 1.0, 1.0 ); p1.Add( 0.0, 1.0 ); IPoly p2 = new PolyDefault(); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 0.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 3.0 ); IPoly exp = new PolyDefault(); exp.Add( p2 ); exp.Add( p1 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); // result.print(); Assert.AreEqual( exp, result ); }
public void TestXortRectInterCorner3() { IPoly p1 = new PolyDefault(); p1.Add( 2.0, 2.0 ); p1.Add( 4.0, 2.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 2.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 3.0, 3.0 ); p2.Add( 5.0, 3.0 ); p2.Add( 5.0, 5.0 ); p2.Add( 3.0, 5.0 ); IPoly exp1 = new PolyDefault(); exp1.Add( 2.0, 2.0 ); exp1.Add( 4.0, 2.0 ); exp1.Add( 4.0, 3.0 ); exp1.Add( 3.0, 3.0 ); exp1.Add( 3.0, 4.0 ); exp1.Add( 2.0, 4.0 ); IPoly exp2 = new PolyDefault(); exp2.Add( 4.0, 3.0 ); exp2.Add( 5.0, 3.0 ); exp2.Add( 5.0, 5.0 ); exp2.Add( 3.0, 5.0 ); exp2.Add( 3.0, 4.0 ); exp2.Add( 4.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( exp2 ); exp.Add( exp1 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestXorRectInterSide4() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 1.0 ); p1.Add( 4.0, 1.0 ); p1.Add( 4.0, 5.0 ); p1.Add( 0.0, 5.0 ); IPoly p2 = new PolyDefault(); p2.Add( -1.0, 2.0 ); p2.Add( 1.0, 2.0 ); p2.Add( 1.0, 4.0 ); p2.Add( -1.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( 4.0, 5.0 ); exp.Add( 0.0, 5.0 ); exp.Add( 0.0, 4.0 ); exp.Add( 1.0, 4.0 ); exp.Add( 1.0, 2.0 ); exp.Add( 0.0, 2.0 ); exp.Add( 0.0, 4.0 ); exp.Add( -1.0, 4.0 ); exp.Add( -1.0, 2.0 ); exp.Add( 0.0, 2.0 ); exp.Add( 0.0, 1.0 ); exp.Add( 4.0, 1.0 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestXorPolyTwoSidesAndLowerVertex() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 1.0 ); p1.Add( 5.0, 1.0 ); p1.Add( 5.0, 6.0 ); p1.Add( 3.0, 4.0 ); p1.Add( 1.0, 6.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly exp1 = new PolyDefault(); exp1.Add( 5.0, 6.0 ); exp1.Add( 3.0, 4.0 ); exp1.Add( 1.0, 6.0 ); exp1.Add( 1.0, 3.0 ); exp1.Add( 2.0, 4.0 ); exp1.Add( 3.0, 3.0 ); exp1.Add( 4.0, 4.0 ); exp1.Add( 5.0, 3.0 ); IPoly exp2 = new PolyDefault(); exp2.Add( 5.0, 3.0 ); exp2.Add( 5.0, 1.0 ); exp2.Add( 3.0, 1.0 ); exp2.Add( 4.0, 0.0 ); exp2.Add( 6.0, 2.0 ); IPoly exp3 = new PolyDefault(); exp3.Add( 1.0, 3.0 ); exp3.Add( 0.0, 2.0 ); exp3.Add( 2.0, 0.0 ); exp3.Add( 3.0, 1.0 ); exp3.Add( 1.0, 1.0 ); IPoly exp = new PolyDefault(); exp.Add( exp1 ); exp.Add( exp2 ); exp.Add( exp3 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestXorRectCorner2() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 4.0, 0.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 0.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 3.0, 0.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 4.0, 1.0 ); p2.Add( 3.0, 1.0 ); IPoly exp = new PolyDefault(); exp.Add( 0.0, 0.0 ); exp.Add( 3.0, 0.0 ); exp.Add( 3.0, 1.0 ); exp.Add( 4.0, 1.0 ); exp.Add( 4.0, 4.0 ); exp.Add( 0.0, 4.0 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestIntersectionOneContainsTwo() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 4.0, 0.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 0.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 2.0, 1.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 3.0 ); PolyDefault result = (PolyDefault) Clipper.Intersection( p1, p2 ); //result.Print(); Assert.AreEqual(p2, result); }
public void TestIntersectionPolyVOverlaps() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 0.0 ); p1.Add( 5.0, 0.0 ); p1.Add( 5.0, 5.0 ); p1.Add( 3.0, 3.0 ); p1.Add( 1.0, 5.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( 1.0, 1.0 ); exp.Add( 2.0, 0.0 ); exp.Add( 3.0, 1.0 ); exp.Add( 4.0, 0.0 ); exp.Add( 5.0, 1.0 ); exp.Add( 5.0, 3.0 ); exp.Add( 4.0, 4.0 ); exp.Add( 3.0, 3.0 ); exp.Add( 2.0, 4.0 ); exp.Add( 1.0, 3.0 ); PolyDefault result = (PolyDefault)Clipper.Intersection( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestUnionPolyTwoSidesOneVertex() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 3.0 ); p1.Add( 5.0, 3.0 ); p1.Add( 5.0, 8.0 ); p1.Add( 3.0, 6.0 ); p1.Add( 1.0, 8.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( 0.0, 2.0 ); exp.Add( 2.0, 0.0 ); exp.Add( 3.0, 1.0 ); exp.Add( 4.0, 0.0 ); exp.Add( 6.0, 2.0 ); exp.Add( 5.0, 3.0 ); exp.Add( 5.0, 8.0 ); exp.Add( 3.0, 6.0 ); exp.Add( 1.0, 8.0 ); exp.Add( 1.0, 3.0 ); PolyDefault result = (PolyDefault)Clipper.Union( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestIntersectionRectangleHole() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 1.0 ); p1.Add( 4.0, 1.0 ); p1.Add( 4.0, 5.0 ); p1.Add( 0.0, 5.0 ); IPoly p2 = new PolyDefault(true); p2.Add( 1.0, 2.0 ); p2.Add( 3.0, 2.0 ); p2.Add( 3.0, 4.0 ); p2.Add( 1.0, 4.0 ); IPoly p12 = new PolyDefault(); p12.Add( p1 ); p12.Add( p2 ); IPoly p3 = new PolyDefault(); p3.Add( 2.0, 0.0 ); p3.Add( 6.0, 0.0 ); p3.Add( 6.0, 6.0 ); p3.Add( 2.0, 6.0 ); IPoly exp = new PolyDefault(); exp.Add( 2.0, 1.0 ); exp.Add( 4.0, 1.0 ); exp.Add( 4.0, 5.0 ); exp.Add( 2.0, 5.0 ); exp.Add( 2.0, 4.0 ); exp.Add( 3.0, 4.0 ); exp.Add( 3.0, 2.0 ); exp.Add( 2.0, 2.0 ); PolyDefault result = (PolyDefault)Clipper.Intersection( p12, p3 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestUnionRectCorner4() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 4.0, 0.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 0.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 3.0 ); p2.Add( 1.0, 3.0 ); p2.Add( 1.0, 4.0 ); p2.Add( 0.0, 4.0 ); IPoly exp = new PolyDefault(); exp.Add( 0.0, 0.0 ); exp.Add( 4.0, 0.0 ); exp.Add( 4.0, 4.0 ); exp.Add( 0.0, 4.0 ); exp.Add( 0.0, 3.0 ); // !!! KNOWN BUG - EXTRA POINT BUT SHAPE IS CORRECT PolyDefault result = (PolyDefault)Clipper.Union( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestIntersectionRectInterCorner3() { IPoly p1 = new PolyDefault(); p1.Add( 2.0, 2.0 ); p1.Add( 4.0, 2.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 2.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 3.0, 3.0 ); p2.Add( 5.0, 3.0 ); p2.Add( 5.0, 5.0 ); p2.Add( 3.0, 5.0 ); IPoly exp = new PolyDefault(); exp.Add( 3.0, 3.0 ); exp.Add( 4.0, 3.0 ); exp.Add( 4.0, 4.0 ); exp.Add( 3.0, 4.0 ); IPoly result = Clipper.Intersection( p1, p2 ); Assert.AreEqual( exp, result ); }
public void TestXorTwoContainsOne() { IPoly p1 = new PolyDefault(); p1.Add( 2.0, 1.0 ); p1.Add( 3.0, 1.0 ); p1.Add( 3.0, 3.0 ); p1.Add( 2.0, 3.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 0.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 0.0, 4.0 ); // notice reverse order IPoly exp2 = new PolyDefault(true); exp2.Add( 3.0, 1.0 ); exp2.Add( 2.0, 1.0 ); exp2.Add( 2.0, 3.0 ); exp2.Add( 3.0, 3.0 ); IPoly exp = new PolyDefault(); exp.Add( p2 ); exp.Add( exp2 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestXorPolyVOverlaps() { IPoly p1 = new PolyDefault(); p1.Add( 1.0, 0.0 ); p1.Add( 5.0, 0.0 ); p1.Add( 5.0, 5.0 ); p1.Add( 3.0, 3.0 ); p1.Add( 1.0, 5.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 2.0 ); p2.Add( 2.0, 0.0 ); p2.Add( 3.0, 1.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 6.0, 2.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 2.0, 4.0 ); IPoly exp1 = new PolyDefault(); exp1.Add( 5.0, 5.0 ); exp1.Add( 4.0, 4.0 ); exp1.Add( 5.0, 3.0 ); IPoly exp2 = new PolyDefault(); exp2.Add( 1.0, 5.0 ); exp2.Add( 1.0, 3.0 ); exp2.Add( 2.0, 4.0 ); IPoly exp3 = new PolyDefault(); exp3.Add( 5.0, 3.0 ); exp3.Add( 5.0, 1.0 ); exp3.Add( 6.0, 2.0 ); IPoly exp4 = new PolyDefault(); exp4.Add( 1.0, 3.0 ); exp4.Add( 0.0, 2.0 ); exp4.Add( 1.0, 1.0 ); IPoly exp5 = new PolyDefault(); exp5.Add( 5.0, 1.0 ); exp5.Add( 4.0, 0.0 ); exp5.Add( 5.0, 0.0 ); IPoly exp6 = new PolyDefault(); exp6.Add( 3.0, 1.0 ); exp6.Add( 2.0, 0.0 ); exp6.Add( 4.0, 0.0 ); IPoly exp7 = new PolyDefault(); exp7.Add( 1.0, 1.0 ); exp7.Add( 1.0, 0.0 ); exp7.Add( 2.0, 0.0 ); IPoly exp = new PolyDefault(); exp.Add( exp1 ); exp.Add( exp2 ); exp.Add( exp3 ); exp.Add( exp4 ); exp.Add( exp5 ); exp.Add( exp6 ); exp.Add( exp7 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestXorRectInterCorner4() { IPoly p1 = new PolyDefault(); p1.Add( 2.0, 2.0 ); p1.Add( 4.0, 2.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 2.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 1.0, 3.0 ); p2.Add( 3.0, 3.0 ); p2.Add( 3.0, 5.0 ); p2.Add( 1.0, 5.0 ); // ------------------------------------------------------------------------------------------ // --- I expected this to give two non-hole inner polygons but it gave one with a hole --- // --- if you look at it, they are equivalent. Don't have time to figure out difference. --- // ------------------------------------------------------------------------------------------ IPoly exp1 = new PolyDefault(true); exp1.Add( 3.0, 3.0 ); exp1.Add( 2.0, 3.0 ); exp1.Add( 2.0, 4.0 ); exp1.Add( 3.0, 4.0 ); IPoly exp2 = new PolyDefault(); exp2.Add( 1.0, 3.0 ); exp2.Add( 2.0, 3.0 ); exp2.Add( 2.0, 2.0 ); exp2.Add( 4.0, 2.0 ); exp2.Add( 4.0, 4.0 ); exp2.Add( 3.0, 4.0 ); exp2.Add( 3.0, 5.0 ); exp2.Add( 1.0, 5.0 ); IPoly exp = new PolyDefault(); exp.Add( exp2 ); exp.Add( exp1 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.AreEqual( exp, result ); }
public void TestXorTwoEqual() { IPoly p1 = new PolyDefault(); p1.Add( 0.0, 0.0 ); p1.Add( 4.0, 0.0 ); p1.Add( 4.0, 4.0 ); p1.Add( 0.0, 4.0 ); IPoly p2 = new PolyDefault(); p2.Add( 0.0, 0.0 ); p2.Add( 4.0, 0.0 ); p2.Add( 4.0, 4.0 ); p2.Add( 0.0, 4.0 ); PolyDefault result = (PolyDefault)Clipper.Xor( p1, p2 ); //result.print(); Assert.IsTrue( result.IsEmpty() ); }