Exemplo n.º 1
0
        /**
         * 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());
        }
Exemplo n.º 2
0
 /// <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;
 }
Exemplo n.º 3
0
        // -------------
        // --- 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);
        }
Exemplo n.º 4
0
        /**
         * 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());
        }
Exemplo n.º 5
0
        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() );
        }
Exemplo n.º 6
0
 /// <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());
     }
 }
Exemplo n.º 7
0
        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() );
        }
Exemplo n.º 8
0
        /**
         * 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;
        }
Exemplo n.º 10
0
        /// <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);
        }
Exemplo n.º 11
0
        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() );
        }
Exemplo n.º 12
0
        /**
         * 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));
        }
Exemplo n.º 13
0
        /**
         * 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));
        }
Exemplo n.º 14
0
        /**
         * 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);
        }
Exemplo n.º 15
0
        /// <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;
        }
Exemplo n.º 16
0
        /**
         * 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);
        }
Exemplo n.º 17
0
        /**
         * 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());
        }
Exemplo n.º 18
0
        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 );
        }
Exemplo n.º 19
0
        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 );
        }
Exemplo n.º 20
0
        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 );
        }
Exemplo n.º 21
0
        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 );
        }
Exemplo n.º 22
0
        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 );
        }
Exemplo n.º 23
0
        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 );
        }
Exemplo n.º 24
0
        /// <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;
        }
Exemplo n.º 25
0
        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() );
        }
Exemplo n.º 26
0
        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 );
        }
Exemplo n.º 27
0
        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 );
        }
Exemplo n.º 28
0
        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 );
        }
Exemplo n.º 29
0
        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 );
        }
Exemplo n.º 30
0
        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 );
        }
Exemplo n.º 31
0
        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 );
        }
Exemplo n.º 32
0
        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);
        }
Exemplo n.º 33
0
        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 );
        }
Exemplo n.º 34
0
        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 );
        }
Exemplo n.º 35
0
        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 );
        }
Exemplo n.º 36
0
        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 );
        }
Exemplo n.º 37
0
        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 );
        }
Exemplo n.º 38
0
        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 );
        }
Exemplo n.º 39
0
        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 );
        }
Exemplo n.º 40
0
        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 );
        }
Exemplo n.º 41
0
        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() );
        }