예제 #1
0
        public void CohenSutherlandAlgorithmClipBasicLineStringTest()
        {
            BasicLineString source = new BasicLineString(new[] { new Coordinate(5, 15), new Coordinate(15, 15), new Coordinate(25, 15) });
            IReadOnlyList <IReadOnlyList <Coordinate> > actual   = CohenSutherlandAlgorithm.Clip(source, this.clippingWindow);
            IReadOnlyList <IReadOnlyList <Coordinate> > expected = new[] { new[] { new Coordinate(10, 15), new Coordinate(15, 15), new Coordinate(20, 15) } };

            actual.ShouldBe(expected);
        }
예제 #2
0
        public void GeometryDistanceAlgorithmDistanceLineStringsTest()
        {
            // parallel line strings
            BasicLineString firstLineString  = new BasicLineString(new[] { new Coordinate(2, 2), new Coordinate(2, -2) });
            BasicLineString secondLineString = new BasicLineString(new[] { new Coordinate(4, 2), new Coordinate(4, -2) });

            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(2);

            firstLineString  = new BasicLineString(new[] { new Coordinate(0, 0), new Coordinate(2, 2) });
            secondLineString = new BasicLineString(new[] { new Coordinate(0, 2), new Coordinate(2, 4) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(Math.Sqrt(2), 0.001);

            firstLineString  = new BasicLineString(new[] { new Coordinate(2, 2), new Coordinate(2, -2), new Coordinate(10, -2), new Coordinate(10, 2) });
            secondLineString = new BasicLineString(new[] { new Coordinate(2, 24), new Coordinate(2, 22), new Coordinate(10, 22), new Coordinate(10, 24) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(20);

            // one line is skewed towards the other
            firstLineString  = new BasicLineString(new[] { new Coordinate(2, 2), new Coordinate(2, -2) });
            secondLineString = new BasicLineString(new Coordinate[] { new Coordinate(4, 2), new Coordinate(3, -2) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(1);

            // a line and a line string, where the line string's middle point is the closest to the middle of the line
            firstLineString  = new BasicLineString(new[] { new Coordinate(2, 2), new Coordinate(2, -2) });
            secondLineString = new BasicLineString(new[] { new Coordinate(4, 2), new Coordinate(3, 0), new Coordinate(7, -2) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(1);

            // intersecting lines
            firstLineString  = new BasicLineString(new[] { new Coordinate(0, 0), new Coordinate(2, 2) });
            secondLineString = new BasicLineString(new[] { new Coordinate(0, 2), new Coordinate(2, 0) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(0);

            firstLineString  = new BasicLineString(new[] { new Coordinate(0, 0), new Coordinate(1, 1) });
            secondLineString = new BasicLineString(new[] { new Coordinate(0, 1), new Coordinate(1, 0) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(0);

            firstLineString  = new BasicLineString(new[] { new Coordinate(0, 0), new Coordinate(1, 1) });
            secondLineString = new BasicLineString(new[] { new Coordinate(1, 1), new Coordinate(2, 2) });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(0);

            // point on line
            BasicPoint point = new BasicPoint(new Coordinate(1, 1));

            secondLineString = new BasicLineString(new[] { new Coordinate(0, 0), new Coordinate(2, 2) });
            GeometryDistanceAlgorithm.Distance(point, secondLineString).ShouldBe(0);

            point            = new BasicPoint(new Coordinate(1.5, 1.5));
            secondLineString = new BasicLineString(new[] { new Coordinate(0, 0), new Coordinate(1, 1), new Coordinate(2, 2) });
            GeometryDistanceAlgorithm.Distance(point, secondLineString).ShouldBe(0);

            // empty line strings
            secondLineString = new BasicLineString(new Coordinate[] { });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(Double.MaxValue);

            firstLineString  = new BasicLineString(new Coordinate[] { });
            secondLineString = new BasicLineString(new Coordinate[] { });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(Double.MaxValue);

            // invalid line
            secondLineString = new BasicLineString(new Coordinate[] { new Coordinate(0, 0), Coordinate.Undefined });
            GeometryDistanceAlgorithm.Distance(firstLineString, secondLineString).ShouldBe(Double.MaxValue);
        }