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