/// <summary>
        /// Computes whether the given coordinate is on the boundary of the polygon.
        /// </summary>
        /// <param name="shell">The polygon shell.</param>
        /// <param name="coordinate">The coordinate to check.</param>
        /// <param name="precisionModel">The precision model.</param>
        /// <returns><c>true</c> if the coordinate is on the boundary of the polygon; otherwise, <c>false</c>.</returns>
        /// <exception cref="System.ArgumentNullException">The shell is null.</exception>
        private static Boolean ComputeOnBoundary(IEnumerable <Coordinate> shell, Coordinate coordinate, PrecisionModel precisionModel)
        {
            IEnumerator <Coordinate> enumerator = shell.GetEnumerator();

            if (!enumerator.MoveNext())
            {
                return(false);
            }

            Coordinate current = enumerator.Current, next;

            while (enumerator.MoveNext())
            {
                next = enumerator.Current;

                if (LineAlgorithms.Contains(current, next, coordinate, precisionModel))
                {
                    return(true);
                }

                current = next;
            }

            return(false);
        }
        /// <summary>
        /// Checks whether the given coordinate is on the shell.
        /// </summary>
        private void CheckBoundary()
        {
            IsOnBoundary = false;

            for (Int32 coordIndex = 0; coordIndex < _shell.Count - 1 || (coordIndex < _shell.Count && _shell[0] != _shell[_shell.Count - 1]); coordIndex++)
            {
                if (LineAlgorithms.Contains(_shell[coordIndex], _shell[(coordIndex + 1) % _shell.Count], _coordinate, PrecisionModel))
                {
                    IsOnBoundary = true;
                    break;
                }
            }
        }
Beispiel #3
0
        public void LineAlgorithmsContainsTest()
        {
            // line contains point
            Coordinate lineStart  = new Coordinate(0, 1);
            Coordinate lineEnd    = new Coordinate(100, 1);
            Coordinate coordinate = new Coordinate(1, 1);

            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));

            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(2, 2);
            coordinate = new Coordinate(1, 1);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));

            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(-4, 2);
            coordinate = new Coordinate(-2, 1);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));

            coordinate = new Coordinate(-1, 0.5);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));


            // line does not contain point
            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(2, 2);
            coordinate = new Coordinate(1, 1.2);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));

            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(0, 200);
            coordinate = new Coordinate(0, 201);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));

            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(0, 200);
            coordinate = new Coordinate(0, 201);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineEnd, coordinate));


            // infinite line contains point
            lineStart = new Coordinate(2, 5);
            CoordinateVector lineVector = new CoordinateVector(0, 1);

            coordinate = new Coordinate(2, 4);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate));

            coordinate = new Coordinate(2, 400);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate));

            lineStart  = new Coordinate(2, 4);
            lineVector = new CoordinateVector(-3, 1);
            coordinate = new Coordinate(14, 0);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate));


            // infinite line does not contain point
            coordinate = new Coordinate(2.001, 400);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineVector, coordinate));

            lineStart  = new Coordinate(1, 1);
            lineVector = new CoordinateVector(0, 2);
            coordinate = new Coordinate(0, 101);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineVector, coordinate));


            // finite line with fixed precision
            PrecisionModel precision = new PrecisionModel(0.001);

            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(2000, 2000);
            coordinate = new Coordinate(1000, 1000);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate, precision));

            lineStart  = new Coordinate(0, 0);
            lineEnd    = new Coordinate(-4000, 2000);
            coordinate = new Coordinate(-3000, 2000);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate, precision));

            coordinate = new Coordinate(-3000, 1000);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate, precision));


            // finite line at given fixed precision
            lineStart  = new Coordinate(12, 201);
            lineEnd    = new Coordinate(1870, 2390);
            coordinate = new Coordinate(980, 1110);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate, precision));

            lineStart  = new Coordinate(-20, 50);
            lineEnd    = new Coordinate(-4102, 1960);
            coordinate = new Coordinate(-2111, 983);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate, precision));

            lineStart  = new Coordinate(-20, 50);
            lineEnd    = new Coordinate(-4102, 1960);
            coordinate = new Coordinate(-2111, 983);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineEnd, coordinate, precision));


            // infinite line with fixed precision
            lineStart  = new Coordinate(1000, 1000);
            lineVector = new CoordinateVector(0, 2000);
            coordinate = new Coordinate(1000, 0);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));

            coordinate = new Coordinate(0, 0);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));

            coordinate = new Coordinate(2000, 0);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));


            // infinite at given fixed precision
            lineStart  = new Coordinate(1260, 1440);
            lineVector = new CoordinateVector(0, 2035);
            coordinate = new Coordinate(1230, 0);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));

            coordinate = new Coordinate(1759, 0);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));

            coordinate = new Coordinate(761, 0);
            Assert.IsTrue(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));

            coordinate = new Coordinate(759, 0);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));

            coordinate = new Coordinate(1761, 0);
            Assert.IsFalse(LineAlgorithms.Contains(lineStart, lineVector, coordinate, precision));
        }