/// <summary> /// Simplifies a segment of the line string. /// </summary> /// <param name="startIndex">The starting index of the segment.</param> /// <param name="endIndex">The ending index of the segment.</param> protected void SimplifySegment(Int32 startIndex, Int32 endIndex) { if (endIndex <= startIndex + 1) // the segment is a line { return; } Double maxDistance = 0; Int32 maxIndex = startIndex; // find the most distant coordinate from the line between the starting and ending coordinates for (Int32 coordinateIndex = startIndex + 1; coordinateIndex < endIndex; coordinateIndex++) { Double distance = LineAlgorithms.Distance(_source[startIndex], _source[endIndex], _source[coordinateIndex], PrecisionModel); if (distance > maxDistance) { maxIndex = coordinateIndex; maxDistance = distance; } } if (maxDistance <= _delta) // the distance is smaller than the delta, the all coordinates should be removed { return; } // recursively simplify both segments _marks[maxIndex] = true; SimplifySegment(startIndex, maxIndex); SimplifySegment(maxIndex, startIndex); }
/// <summary> /// Simplifies a segment of the line string. /// </summary> /// <param name="startIndex">The starting index of the segment.</param> /// <param name="endIndex">The ending index of the segment.</param> private void SimplifySegment(Int32 startIndex, Int32 endIndex) { if (this.Source[startIndex] == null || this.Source[endIndex] == null) { return; } if (endIndex <= startIndex + 1) // the segment is a line { return; } Double maxDistance = 0; Int32 maxIndex = startIndex; // find the most distant coordinate from the line between the starting and ending coordinates for (Int32 coordinateIndex = startIndex + 1; coordinateIndex < endIndex; coordinateIndex++) { if (this.Source[coordinateIndex] == null) { continue; } Double distance = LineAlgorithms.Distance(this.Source[startIndex], this.Source[endIndex], this.Source[coordinateIndex], this.PrecisionModel); if (distance > maxDistance) { maxIndex = coordinateIndex; maxDistance = distance; } } if (maxDistance <= this.delta) { // the distance is smaller than the delta, all coordinates should be removed return; } // recursively simplify both segments this.marks[maxIndex] = true; this.SimplifySegment(startIndex, maxIndex); this.SimplifySegment(maxIndex, startIndex); }
public void LineAlgorithmsDistanceTest() { // distance of a line and a coordinate Coordinate lineStart = new Coordinate(0, 1); Coordinate lineEnd = new Coordinate(100, 1); Coordinate coordinate = new Coordinate(1, 1); Assert.AreEqual(0, LineAlgorithms.Distance(lineStart, lineEnd, coordinate)); lineStart = new Coordinate(0, 1); lineEnd = new Coordinate(100, 1); coordinate = new Coordinate(1, 7); Assert.AreEqual(6, LineAlgorithms.Distance(lineStart, lineEnd, coordinate)); lineStart = new Coordinate(5, 7); lineEnd = new Coordinate(5, 70); coordinate = new Coordinate(5, 6); Assert.AreEqual(1, LineAlgorithms.Distance(lineStart, lineEnd, coordinate)); lineStart = new Coordinate(5, 7); lineEnd = new Coordinate(5, 70); coordinate = new Coordinate(4, 7); Assert.AreEqual(1, LineAlgorithms.Distance(lineStart, lineEnd, coordinate)); lineStart = new Coordinate(0, 0); lineEnd = new Coordinate(2, -3); coordinate = new Coordinate(2, 1); Assert.AreEqual(2.22, Math.Round(LineAlgorithms.Distance(lineStart, lineEnd, coordinate), 2)); // distance of two lines lineStart = new Coordinate(0, 0); lineEnd = new Coordinate(100, 0); Coordinate secondLineStart = new Coordinate(0, 0); Coordinate secondLineEnd = new Coordinate(0, 100); Assert.AreEqual(0, LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd)); lineStart = new Coordinate(0, 0); lineEnd = new Coordinate(100, 0); secondLineStart = new Coordinate(0, 1); secondLineEnd = new Coordinate(100, 1); Assert.AreEqual(1, LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd)); lineStart = new Coordinate(2, 4); lineEnd = new Coordinate(5, 3); secondLineStart = new Coordinate(6, 2); secondLineEnd = new Coordinate(6, 6); Assert.AreEqual(1, LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd)); lineStart = new Coordinate(1, 1); lineEnd = new Coordinate(1, 4); secondLineStart = new Coordinate(4, 2); secondLineEnd = new Coordinate(0, 2); Assert.AreEqual(0, LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd)); // distance of an infinite line and a point lineStart = new Coordinate(1, 1); CoordinateVector coordinateVector = new CoordinateVector(0, 1); coordinate = new Coordinate(2, 1500); Assert.AreEqual(1, LineAlgorithms.Distance(lineStart, coordinateVector, coordinate)); lineStart = new Coordinate(1, 1); coordinateVector = new CoordinateVector(0, 1); coordinate = new Coordinate(1, 1500); Assert.AreEqual(0, LineAlgorithms.Distance(lineStart, coordinateVector, coordinate)); lineStart = new Coordinate(1, 1); coordinateVector = new CoordinateVector(0, 1); coordinate = new Coordinate(0, -100); Assert.AreEqual(1, LineAlgorithms.Distance(lineStart, coordinateVector, coordinate)); lineStart = new Coordinate(2, 4); coordinateVector = new CoordinateVector(-3, 1); coordinate = new Coordinate(14, 0); Assert.AreEqual(0, LineAlgorithms.Distance(lineStart, coordinateVector, coordinate)); lineStart = new Coordinate(2, 4); coordinateVector = new CoordinateVector(-3, 1); coordinate = new Coordinate(5, 3); Assert.AreEqual(0, LineAlgorithms.Distance(lineStart, coordinateVector, coordinate)); }
public void LineAlgorithmsDistanceTest() { // distance of a line and a coordinate Coordinate lineStart = new Coordinate(0, 1); Coordinate lineEnd = new Coordinate(100, 1); Coordinate coordinate = new Coordinate(1, 1); LineAlgorithms.Distance(lineStart, lineEnd, coordinate).ShouldBe(0); lineStart = new Coordinate(0, 1); lineEnd = new Coordinate(100, 1); coordinate = new Coordinate(1, 7); LineAlgorithms.Distance(lineStart, lineEnd, coordinate).ShouldBe(6); lineStart = new Coordinate(5, 7); lineEnd = new Coordinate(5, 70); coordinate = new Coordinate(5, 6); LineAlgorithms.Distance(lineStart, lineEnd, coordinate).ShouldBe(1); lineStart = new Coordinate(5, 7); lineEnd = new Coordinate(5, 70); coordinate = new Coordinate(4, 7); LineAlgorithms.Distance(lineStart, lineEnd, coordinate).ShouldBe(1); lineStart = new Coordinate(0, 0); lineEnd = new Coordinate(2, -3); coordinate = new Coordinate(2, 1); LineAlgorithms.Distance(lineStart, lineEnd, coordinate).ShouldBe(2.22, 0.01); // distance of two lines lineStart = new Coordinate(0, 0); lineEnd = new Coordinate(100, 0); Coordinate secondLineStart = new Coordinate(0, 0); Coordinate secondLineEnd = new Coordinate(0, 100); LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd).ShouldBe(0); lineStart = new Coordinate(0, 0); lineEnd = new Coordinate(100, 0); secondLineStart = new Coordinate(0, 1); secondLineEnd = new Coordinate(100, 1); LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd).ShouldBe(1); lineStart = new Coordinate(2, 4); lineEnd = new Coordinate(5, 3); secondLineStart = new Coordinate(6, 2); secondLineEnd = new Coordinate(6, 6); LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd).ShouldBe(1); lineStart = new Coordinate(1, 1); lineEnd = new Coordinate(1, 4); secondLineStart = new Coordinate(4, 2); secondLineEnd = new Coordinate(0, 2); LineAlgorithms.Distance(lineStart, lineEnd, secondLineStart, secondLineEnd).ShouldBe(0); // distance of an infinite line and a point lineStart = new Coordinate(1, 1); CoordinateVector coordinateVector = new CoordinateVector(0, 1); coordinate = new Coordinate(2, 1500); LineAlgorithms.Distance(lineStart, coordinateVector, coordinate).ShouldBe(1); lineStart = new Coordinate(1, 1); coordinateVector = new CoordinateVector(0, 1); coordinate = new Coordinate(1, 1500); LineAlgorithms.Distance(lineStart, coordinateVector, coordinate).ShouldBe(0); lineStart = new Coordinate(1, 1); coordinateVector = new CoordinateVector(0, 1); coordinate = new Coordinate(0, -100); LineAlgorithms.Distance(lineStart, coordinateVector, coordinate).ShouldBe(1); lineStart = new Coordinate(2, 4); coordinateVector = new CoordinateVector(-3, 1); coordinate = new Coordinate(14, 0); LineAlgorithms.Distance(lineStart, coordinateVector, coordinate).ShouldBe(0); lineStart = new Coordinate(2, 4); coordinateVector = new CoordinateVector(-3, 1); coordinate = new Coordinate(5, 3); LineAlgorithms.Distance(lineStart, coordinateVector, coordinate).ShouldBe(0); }