/// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
        }