Esempio n. 1
0
 public BasicGradientBrush(BasicColor color, BasicColor color2, float angle) : base(color)
 {
     Color2 = color2;
     Angle = angle;
     StartPoint = new BasicPoint(0, 0);
     EndPoint = new BasicPoint(0, 0);
 }
Esempio n. 2
0
        public void GeometryDistanceAlgorithmDistancePointsTest()
        {
            BasicPoint first  = new BasicPoint(new Coordinate(0, 10));
            BasicPoint second = new BasicPoint(new Coordinate(10, 10));

            GeometryDistanceAlgorithm.Distance(first, second).ShouldBe(10);

            first  = new BasicPoint(new Coordinate(10, 10));
            second = new BasicPoint(new Coordinate(10, 0));
            GeometryDistanceAlgorithm.Distance(first, second).ShouldBe(10);

            first  = new BasicPoint(new Coordinate(67, 75));
            second = new BasicPoint(new Coordinate(17, 89));
            GeometryDistanceAlgorithm.Distance(first, second).ShouldBe(51.92, 0.01);

            // same point
            GeometryDistanceAlgorithm.Distance(first, first).ShouldBe(0);

            // same coordinate
            second = new BasicPoint(first.Coordinate);
            GeometryDistanceAlgorithm.Distance(first, second).ShouldBe(0);

            // undefined coordinate
            second = new BasicPoint(Coordinate.Undefined);
            GeometryDistanceAlgorithm.Distance(first, second).ShouldBe(Double.NaN);
        }
Esempio n. 3
0
 public BasicGradientBrush(BasicColor color, BasicColor color2, BasicPoint startPoint, BasicPoint endPoint)
     : base(color)
 {
     Color2 = color2;
     StartPoint = startPoint;
     EndPoint = endPoint;
 }
Esempio n. 4
0
        private void GetingOutSideItem()
        {
            IBoard <IItem, int> board = new BasicBoard(360);

            IItem        item  = new BasicEnemy(range: 5);
            IPoint <int> point = new BasicPoint(1);

            board.Put(item, point);
            board.Get(new BasicPoint(360), new BasicWeapon());
        }
Esempio n. 5
0
        public void GetFreeAreaLessOneItem()
        {
            IBoard <IItem, int> board = new BasicBoard(4);

            IItem        item  = new BasicEnemy(range: 2);
            IPoint <int> point = new BasicPoint(1);

            board.Put(item, point);

            Assert.AreEqual(1, board.FreePointsTo(item).Length);
        }
Esempio n. 6
0
        public void GetItemInsideRange()
        {
            IBoard <IItem, int> board = new BasicBoard();

            IItem        item  = new BasicEnemy(range: 5);
            IPoint <int> point = new BasicPoint(360);

            board.Put(item, point);

            Assert.AreSame(item, board.Get(new BasicPoint(2), new BasicWeapon()));
        }
Esempio n. 7
0
        public void MustBeAFullBoard()
        {
            IBoard <IItem, int> board = new BasicBoard(4);

            IItem        item  = new BasicEnemy(range: 4);
            IPoint <int> point = new BasicPoint(1);

            board.Put(item, point);

            Assert.AreEqual(0, board.FreePointsTo(item).Length);
        }
Esempio n. 8
0
        public void GetItemAtSamePosition()
        {
            IBoard <IItem, int> board = new BasicBoard();

            IItem        item  = new BasicEnemy(5);
            IPoint <int> point = new BasicPoint(1);

            board.Put(item, point);

            Assert.AreSame(item, board.Get(point, new BasicWeapon()));
        }
Esempio n. 9
0
        public void GeometryDistanceAlgorithmDistancePolygonsTest()
        {
            // point outside polygon
            BasicPoint   point   = new BasicPoint(new Coordinate(1, 4));
            BasicPolygon polygon = new BasicPolygon(new[] { new Coordinate(0, 0), new Coordinate(2, 0), new Coordinate(2, 2), new Coordinate(0, 2) });

            GeometryDistanceAlgorithm.Distance(point, polygon).ShouldBe(2);

            // point on polygon shell
            point   = new BasicPoint(new Coordinate(2, 1));
            polygon = new BasicPolygon(new[] { new Coordinate(0, 0), new Coordinate(2, 0), new Coordinate(2, 2), new Coordinate(0, 2) });

            GeometryDistanceAlgorithm.Distance(point, polygon).ShouldBe(0);

            // point in polygon
            point   = new BasicPoint(new Coordinate(1, 1));
            polygon = new BasicPolygon(new[] { new Coordinate(0, 0), new Coordinate(2, 0), new Coordinate(2, 2), new Coordinate(0, 2) });

            GeometryDistanceAlgorithm.Distance(point, polygon).ShouldBe(0);
        }
Esempio n. 10
0
        public void MinkowskiSumAlgorithmBufferTest()
        {
            // two triangles
            Coordinate[] buffer        = new[] { new Coordinate(5, 5), new Coordinate(5, 7), new Coordinate(4, 6) };
            Coordinate[] sourceShell   = new[] { new Coordinate(2, 1), new Coordinate(4, 1), new Coordinate(3, 3), new Coordinate(2, 1) };
            Coordinate[] expectedShell = new[]
            {
                new Coordinate(6, 7),
                new Coordinate(7, 6),
                new Coordinate(9, 6),
                new Coordinate(9, 8),
                new Coordinate(8, 10),
                new Coordinate(7, 9),
            };

            IBasicPolygon expected = new BasicPolygon(expectedShell);
            IBasicPolygon actual   = MinkowskiSumAlgorithm.Buffer(sourceShell, buffer);

            PolygonAlgorithms.IsConvex(actual).ShouldBeTrue();
            actual.Shell.ShouldBe(expected.Shell);

            // triangle and a square
            buffer = new[] { new Coordinate(8, 6), new Coordinate(9, 6), new Coordinate(9, 7), new Coordinate(8, 7) };

            sourceShell = new[] { new Coordinate(3, 4), new Coordinate(5, 4), new Coordinate(4, 6), new Coordinate(3, 4) };

            expectedShell = new[]
            {
                new Coordinate(11, 11),
                new Coordinate(11, 10),
                new Coordinate(13, 10),
                new Coordinate(14, 10),
                new Coordinate(14, 11),
                new Coordinate(13, 13),
                new Coordinate(12, 13),
                new Coordinate(11, 11)
            };

            expected = new BasicPolygon(expectedShell);
            actual   = MinkowskiSumAlgorithm.Buffer(sourceShell, buffer);

            PolygonAlgorithms.IsConvex(actual).ShouldBeTrue();
            actual.Shell.ShouldBe(expected.Shell);

            // square and circle of 4 points (square)
            buffer = new[] { new Coordinate(8, 6), new Coordinate(9, 6), new Coordinate(9, 7), new Coordinate(8, 7), new Coordinate(8, 6) };

            expectedShell = new[]
            {
                new Coordinate(6, 6),
                new Coordinate(8, 4),
                new Coordinate(9, 4),
                new Coordinate(11, 6),
                new Coordinate(11, 7),
                new Coordinate(9, 9),
                new Coordinate(8, 9),
                new Coordinate(6, 7),
                new Coordinate(6, 6)
            };

            expected = new BasicPolygon(expectedShell);
            actual   = MinkowskiSumAlgorithm.Buffer(buffer, 2, 4);

            PolygonAlgorithms.IsConvex(actual).ShouldBeTrue();
            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            // point and circle (of 4 points)
            IBasicPoint point = new BasicPoint(new Coordinate(1, 1, 0));

            actual = MinkowskiSumAlgorithm.Buffer(point, 2, 4);

            expectedShell = new[]
            {
                new Coordinate(3, 1), new Coordinate(1, 3),
                new Coordinate(-1, 1), new Coordinate(1, -1)
            };

            expected = new BasicPolygon(expectedShell);

            PolygonAlgorithms.IsConvex(actual).ShouldBeTrue();
            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            // square with a square hole and circle (of 8 points)
            sourceShell = new[]
            {
                new Coordinate(1, 1),
                new Coordinate(9, 1),
                new Coordinate(9, 9),
                new Coordinate(1, 9),
                new Coordinate(1, 1)
            };
            Coordinate[][] sourceHoles = new[]
            {
                new[]
                {
                    new Coordinate(3, 3),
                    new Coordinate(3, 7),
                    new Coordinate(7, 7),
                    new Coordinate(7, 3),
                    new Coordinate(3, 3)
                }
            };

            actual = MinkowskiSumAlgorithm.Buffer(new BasicPolygon(sourceShell, sourceHoles), 1, 8);

            expectedShell = new[]
            {
                new Coordinate(0, 1), new Coordinate(0.3, 0.3),
                new Coordinate(1, 0), new Coordinate(9, 0),
                new Coordinate(9.7, 0.3), new Coordinate(10, 1),
                new Coordinate(10, 9), new Coordinate(9.7, 9.7),
                new Coordinate(9, 10), new Coordinate(1, 10),
                new Coordinate(0.3, 9.7), new Coordinate(0, 9)
            };
            Coordinate[][] expectedHoles = new[]
            {
                new[]
                {
                    new Coordinate(4, 3), new Coordinate(3.7, 3.7),
                    new Coordinate(3, 4), new Coordinate(3, 6),
                    new Coordinate(3.7, 6.3), new Coordinate(4, 7),
                    new Coordinate(6, 7), new Coordinate(6.3, 6.3),
                    new Coordinate(7, 6), new Coordinate(7, 4),
                    new Coordinate(6.3, 3.7), new Coordinate(6, 3)
                }
            };

            expected = new BasicPolygon(expectedShell, expectedHoles);

            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            actual.HoleCount.ShouldBe(expected.HoleCount);
            for (Int32 holeIndex = 0; holeIndex < expected.HoleCount; holeIndex++)
            {
                actual.Holes[holeIndex].Count.ShouldBe(expected.Holes[holeIndex].Count);
                for (Int32 coordIndex = 0; coordIndex < expected.Holes[holeIndex].Count; coordIndex++)
                {
                    actual.Holes[holeIndex][coordIndex].X.ShouldBe(expected.Holes[holeIndex][coordIndex].X, 0.01);
                    actual.Holes[holeIndex][coordIndex].Y.ShouldBe(expected.Holes[holeIndex][coordIndex].Y, 0.01);
                }
            }

            // line string (2 points) and square
            buffer = new[] { new Coordinate(0, 2), new Coordinate(0, 0), new Coordinate(2, 0), new Coordinate(2, 2) };

            actual        = MinkowskiSumAlgorithm.Buffer(new[] { new Coordinate(0, 4), new Coordinate(2, 4) }, buffer);
            expectedShell = new[]
            {
                new Coordinate(0, 6), new Coordinate(0, 4),
                new Coordinate(2, 4), new Coordinate(4, 4),
                new Coordinate(4, 6), new Coordinate(2, 6)
            };
            expected = new BasicPolygon(expectedShell);

            actual.Shell.ShouldBe(expected.Shell);

            // line string (4 points) and square
            buffer = new[] { new Coordinate(0, 2), new Coordinate(0, 0), new Coordinate(2, 0), new Coordinate(2, 2) };

            actual        = MinkowskiSumAlgorithm.Buffer(new[] { new Coordinate(1, 1), new Coordinate(3, 3), new Coordinate(5, 6), new Coordinate(3, 8) }, buffer);
            expectedShell = new[]
            {
                new Coordinate(1, 3), new Coordinate(1, 1),
                new Coordinate(3, 1), new Coordinate(5, 3),
                new Coordinate(7, 6), new Coordinate(7, 8),
                new Coordinate(5, 10), new Coordinate(3, 10)
            };
            expected = new BasicPolygon(expectedShell);

            actual.Shell.ShouldBe(expected.Shell);

            // concave and convex with no hole in the result
            buffer = new[] { new Coordinate(13, 2), new Coordinate(14, 3), new Coordinate(13, 4), new Coordinate(12, 3) };

            sourceShell = new[]
            {
                new Coordinate(1, 1), new Coordinate(11, 1),
                new Coordinate(11, 6), new Coordinate(8, 6),
                new Coordinate(9, 3), new Coordinate(3, 3),
                new Coordinate(4, 6), new Coordinate(1, 6)
            };

            actual = MinkowskiSumAlgorithm.Buffer(sourceShell, buffer);

            expectedShell = new[]
            {
                new Coordinate(13, 4), new Coordinate(14, 3),
                new Coordinate(24, 3), new Coordinate(25, 4),
                new Coordinate(25, 9), new Coordinate(24, 10),
                new Coordinate(21, 10), new Coordinate(20, 9),
                new Coordinate(20.67, 7), new Coordinate(17.33, 7),
                new Coordinate(18, 9), new Coordinate(17, 10),
                new Coordinate(14, 10), new Coordinate(13, 9)
            };

            expected = new BasicPolygon(expectedShell);
            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            // convex and concave with no hole in the result
            buffer = new[] { new Coordinate(0, 3), new Coordinate(-3, 0), new Coordinate(0, -3), new Coordinate(3, 0) };

            sourceShell = new[]
            {
                new Coordinate(1, 1), new Coordinate(11, 1),
                new Coordinate(11, 6), new Coordinate(8, 6),
                new Coordinate(9, 3), new Coordinate(3, 3),
                new Coordinate(4, 6), new Coordinate(1, 6)
            };

            actual = MinkowskiSumAlgorithm.Buffer(sourceShell, buffer);

            expectedShell = new[]
            {
                new Coordinate(-2, 1), new Coordinate(1, -2),
                new Coordinate(11, -2), new Coordinate(14, 1),
                new Coordinate(14, 6), new Coordinate(11, 9),
                new Coordinate(8, 9), new Coordinate(6, 7),
                new Coordinate(4, 9), new Coordinate(1, 9),
                new Coordinate(-2, 6)
            };

            expected = new BasicPolygon(expectedShell);
            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            // convex and concave with hole in the result
            buffer = new[] { new Coordinate(13, 4), new Coordinate(12, 3), new Coordinate(13, 2), new Coordinate(14, 3) };

            sourceShell = new[]
            {
                new Coordinate(1, 1), new Coordinate(11, 1),
                new Coordinate(11, 6), new Coordinate(7, 6),
                new Coordinate(9, 3), new Coordinate(4, 3),
                new Coordinate(6, 6), new Coordinate(1, 6)
            };

            actual        = MinkowskiSumAlgorithm.Buffer(sourceShell, buffer);
            expectedShell = new[]
            {
                new Coordinate(13, 4), new Coordinate(14, 3),
                new Coordinate(24, 3), new Coordinate(25, 4),
                new Coordinate(25, 9), new Coordinate(24, 10),
                new Coordinate(20, 10), new Coordinate(19.5, 9.5),
                new Coordinate(19, 10), new Coordinate(14, 10),
                new Coordinate(13, 9)
            };

            expectedHoles = new[]
            {
                new[]
                {
                    new Coordinate(19.5, 8.25),
                    new Coordinate(20.3, 7),
                    new Coordinate(18.6, 7)
                }
            };

            expected = new BasicPolygon(expectedShell, expectedHoles);
            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            actual.HoleCount.ShouldBe(expected.HoleCount);
            for (Int32 holeIndex = 0; holeIndex < expected.HoleCount; holeIndex++)
            {
                actual.Holes[holeIndex].Count.ShouldBe(expected.Holes[holeIndex].Count);
                for (Int32 coordIndex = 0; coordIndex < expected.Holes[holeIndex].Count; coordIndex++)
                {
                    actual.Holes[holeIndex][coordIndex].X.ShouldBe(expected.Holes[holeIndex][coordIndex].X, 0.1);
                    actual.Holes[holeIndex][coordIndex].Y.ShouldBe(expected.Holes[holeIndex][coordIndex].Y, 0.1);
                }
            }

            // convex source polygon with hole and a rhombus
            buffer = new[]
            {
                new Coordinate(10, 2),
                new Coordinate(11, 3),
                new Coordinate(10, 4),
                new Coordinate(9, 3)
            };

            sourceShell = new[]
            {
                new Coordinate(1, 1),
                new Coordinate(9, 1),
                new Coordinate(9, 9),
                new Coordinate(1, 9),
                new Coordinate(1, 1)
            };

            sourceHoles = new[]
            {
                new[]
                {
                    new Coordinate(3, 3),
                    new Coordinate(3, 7),
                    new Coordinate(7, 7),
                    new Coordinate(7, 3),
                    new Coordinate(3, 3)
                }
            };

            actual = MinkowskiSumAlgorithm.Buffer(new BasicPolygon(sourceShell, sourceHoles), new BasicPolygon(buffer));

            expectedShell = new[]
            {
                new Coordinate(10, 4), new Coordinate(11, 3),
                new Coordinate(19, 3), new Coordinate(20, 4),
                new Coordinate(20, 12), new Coordinate(19, 13),
                new Coordinate(11, 13), new Coordinate(10, 12)
            };

            expectedHoles = new[]
            {
                new[]
                {
                    new Coordinate(14, 6), new Coordinate(13, 7),
                    new Coordinate(13, 9), new Coordinate(14, 10),
                    new Coordinate(16, 10), new Coordinate(17, 9),
                    new Coordinate(17, 7), new Coordinate(16, 6)
                }
            };

            expected = new BasicPolygon(expectedShell, expectedHoles);

            actual.Shell.Count.ShouldBe(expected.Shell.Count);
            for (Int32 coordIndex = 0; coordIndex < expected.Shell.Count; coordIndex++)
            {
                actual.Shell[coordIndex].X.ShouldBe(expected.Shell[coordIndex].X, 0.01);
                actual.Shell[coordIndex].Y.ShouldBe(expected.Shell[coordIndex].Y, 0.01);
            }

            actual.HoleCount.ShouldBe(expected.HoleCount);
            for (Int32 holeIndex = 0; holeIndex < expected.HoleCount; holeIndex++)
            {
                actual.Shell.Count.ShouldBe(expected.Holes[holeIndex].Count);
                for (Int32 coordIndex = 0; coordIndex < expected.Holes[holeIndex].Count; coordIndex++)
                {
                    actual.Holes[holeIndex][coordIndex].X.ShouldBe(expected.Holes[holeIndex][coordIndex].X, 0.01);
                    actual.Holes[holeIndex][coordIndex].Y.ShouldBe(expected.Holes[holeIndex][coordIndex].Y, 0.01);
                }
            }

            // exceptions
            Should.Throw <ArgumentNullException>(() => MinkowskiSumAlgorithm.Buffer((IBasicPolygon)null, new BasicPolygon(buffer)));
            Should.Throw <ArgumentNullException>(() => MinkowskiSumAlgorithm.Buffer(new BasicPolygon(sourceShell, sourceHoles), null));
        }
Esempio n. 11
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);
        }