Exemplo n.º 1
0
        public void CanDetermineTouchesXY()
        {
            var pnts1 = new List <Pnt3D>();
            var pnts2 = new List <Pnt3D>();
            var pnts3 = new List <Pnt3D>();

            // ring1: horizontal:
            pnts1.Add(new Pnt3D(0, 0, 9));
            pnts1.Add(new Pnt3D(0, 100, 9));
            pnts1.Add(new Pnt3D(100, 100, 9));
            pnts1.Add(new Pnt3D(100, 0, 9));
            pnts1.Add(new Pnt3D(0, 0, 9));

            // ring 2: also horizontal, adjacent, touching along line
            pnts2.Add(new Pnt3D(100, 10, 18));
            pnts2.Add(new Pnt3D(100, 90, 18));
            pnts2.Add(new Pnt3D(200, 90, 18));
            pnts2.Add(new Pnt3D(200, 10, 18));
            pnts2.Add(new Pnt3D(100, 10, 18));

            // ring 3: containing both rings, touching ring1
            pnts3.Add(new Pnt3D(0, -10, 0));
            pnts3.Add(new Pnt3D(0, 110, 0));
            pnts3.Add(new Pnt3D(250, 110, 0));
            pnts3.Add(new Pnt3D(250, -10, 0));
            pnts3.Add(new Pnt3D(0, -10, 0));

            var ring1 = new Linestring(pnts1);
            var ring2 = new Linestring(pnts2);
            var ring3 = new Linestring(pnts3);

            bool disjoint;

            Assert.IsTrue(GeomRelationUtils.TouchesXY(ring1, ring2, 0.00001, out disjoint));
            Assert.False(disjoint);

            // ring3 is exterior ring that contains ring1
            Assert.False(GeomRelationUtils.TouchesXY(ring1, ring3, 0.00001, out disjoint, true));
            Assert.False(disjoint);
            // use orientation information (ring3
            Assert.False(GeomRelationUtils.TouchesXY(ring1, ring3, 0.00001, out disjoint));

            ring3.ReverseOrientation();
            // Now ring3 is interior ring that contains ring1 (i.e. outside -> touches)
            Assert.True(GeomRelationUtils.TouchesXY(ring1, ring3, 0.00001, out disjoint));
            Assert.False(disjoint);

            const bool disregardRingOrientation = true;

            Assert.False(GeomRelationUtils.TouchesXY(ring1, ring3, 0.00001, out disjoint,
                                                     disregardRingOrientation));
            Assert.False(disjoint);

            // now ring2 becomes an inner ring and ring1 should not be touching it any more:
            pnts2.Reverse();
            var innerRing2 = new Linestring(pnts2);

            Assert.IsFalse(GeomRelationUtils.TouchesXY(ring1, innerRing2, 0.00001, out disjoint));
        }
Exemplo n.º 2
0
        public void CanDetermineTouchesXYVerticalRing()
        {
            var verticalRing = new Linestring(new List <Pnt3D>
            {
                new Pnt3D(0, 0, 0),
                new Pnt3D(30, 100, 0),
                new Pnt3D(30, 100, 55),
                new Pnt3D(0, 0, 55),
                new Pnt3D(0, 0, 0)
            });

            var adjacentRing = new Linestring(new List <Pnt3D>
            {
                new Pnt3D(0, 0, 0),
                new Pnt3D(30, 100, 0),
                new Pnt3D(30, 0, 0),
                new Pnt3D(0, 0, 0)
            });

            bool disjoint;

            Assert.True(GeomRelationUtils.TouchesXY(adjacentRing, verticalRing, 0.0001,
                                                    out disjoint, true,
                                                    true));
            Assert.False(disjoint);

            adjacentRing.ReverseOrientation();
            Assert.True(GeomRelationUtils.TouchesXY(adjacentRing, verticalRing, 0.0001,
                                                    out disjoint, true,
                                                    true));
            Assert.False(disjoint);

            var containedVerticalRing = new Linestring(new List <Pnt3D>
            {
                new Pnt3D(0, 0, 0),
                new Pnt3D(30, 80, 0),
                new Pnt3D(30, 80, 55),
                new Pnt3D(0, 0, 55),
                new Pnt3D(0, 0, 0)
            });

            Assert.False(GeomRelationUtils.TouchesXY(adjacentRing, containedVerticalRing, 0.0001,
                                                     out disjoint, true, true));
        }
Exemplo n.º 3
0
        public void CanDetermineTouchesIdenticalRings()
        {
            var ring1 = new List <Pnt3D>();

            // ring1: horizontal:
            ring1.Add(new Pnt3D(0, 0, 9));
            ring1.Add(new Pnt3D(0, 100, 9));
            ring1.Add(new Pnt3D(100, 50, 9));
            ring1.Add(new Pnt3D(100, 20, 9));

            var ring2 = new List <Pnt3D>(ring1);

            ring2.Add(ring2[0]);

            for (var i = 0; i < 4; i++)
            {
                Pnt3D[] array1 = ring1.ToArray();
                CollectionUtils.Rotate(array1, i);
                var rotatedRing = new List <Pnt3D>(array1);

                rotatedRing.Add((Pnt3D)rotatedRing[0].Clone());

                var linestring1 = new Linestring(rotatedRing);
                var linestring2 = new Linestring(ring2);

                bool disjoint;
                Assert.False(
                    GeomRelationUtils.TouchesXY(linestring1, linestring2, 0.0001, out disjoint));
                Assert.False(disjoint);

                linestring2.ReverseOrientation();

                Assert.False(GeomRelationUtils.TouchesXY(linestring1, linestring2, 0.0001,
                                                         out disjoint,
                                                         true));
                Assert.False(disjoint);
            }
        }