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); }
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); }