/// <summary> /// /// </summary> /// <returns></returns> public bool IsNonNested() { for (int i = 0; i < rings.Count; i++) { ILinearRing innerRing = (ILinearRing)rings[i]; Coordinate[] innerRingPts = innerRing.Coordinates; for (int j = 0; j < rings.Count; j++) { ILinearRing searchRing = (ILinearRing)rings[j]; Coordinate[] searchRingPts = searchRing.Coordinates; if (innerRing == searchRing) { continue; } if (!innerRing.EnvelopeInternal.Intersects(searchRing.EnvelopeInternal)) { continue; } Coordinate innerRingPt = IsValidOp.FindPointNotNode(innerRingPts, searchRing, graph); Assert.IsTrue(innerRingPt != null, "Unable to find a ring point not a node of the search ring"); bool isInside = CGAlgorithms.IsPointInRing(innerRingPt, searchRingPts); if (isInside) { nestedPt = innerRingPt; return(false); } } } return(true); }
/// <summary> /// /// </summary> /// <returns></returns> public bool IsNonNested() { foreach (var innerRing in rings) { var innerRingPts = innerRing.Coordinates; foreach (var searchRing in rings) { var searchRingPts = searchRing.Coordinates; if (innerRing == searchRing) { continue; } if (!innerRing.EnvelopeInternal.Intersects(searchRing.EnvelopeInternal)) { continue; } var innerRingPt = IsValidOp.FindPointNotNode(innerRingPts, searchRing, graph); Assert.IsTrue(innerRingPt != null, "Unable to find a ring point not a node of the search ring"); bool isInside = PointLocation.IsInRing(innerRingPt, searchRingPts); if (isInside) { nestedPt = innerRingPt; return(false); } } } return(true); }
public bool IsNonNested() { BuildIndex(); for (int i = 0; i < _rings.Count; i++) { var innerRing = (ILinearRing)_rings[i]; var innerRingPts = innerRing.Coordinates; var results = _index.Query(innerRing.EnvelopeInternal); for (int j = 0; j < results.Count; j++) { var searchRing = (ILinearRing)results[j]; var searchRingPts = searchRing.Coordinates; if (innerRing == searchRing) { continue; } if (!innerRing.EnvelopeInternal.Intersects(searchRing.EnvelopeInternal)) { continue; } var innerRingPt = IsValidOp.FindPointNotNode(innerRingPts, searchRing, _graph); // Diego Guidi: removed => see Issue 121 //Assert.IsTrue(innerRingPt != null, "Unable to find a ring point not a node of the search ring"); /** * If no non-node pts can be found, this means * that the searchRing touches ALL of the innerRing vertices. * This indicates an invalid polygon, since either * the two holes create a disconnected interior, * or they touch in an infinite number of points * (i.e. along a line segment). * Both of these cases are caught by other tests, * so it is safe to simply skip this situation here. */ if (innerRingPt == null) { continue; } bool isInside = PointLocation.IsInRing(innerRingPt, searchRingPts); if (isInside) { _nestedPt = innerRingPt; return(false); } } } return(true); }
/// <summary> /// /// </summary> /// <param name="innerRing"></param> /// <param name="searchRing"></param> /// <returns></returns> private bool IsInside(ILinearRing innerRing, ILinearRing searchRing) { Coordinate[] innerRingPts = innerRing.Coordinates; Coordinate[] searchRingPts = searchRing.Coordinates; if (!innerRing.EnvelopeInternal.Intersects(searchRing.EnvelopeInternal)) { return(false); } Coordinate innerRingPt = IsValidOp.FindPointNotNode(innerRingPts, searchRing, graph); Assert.IsTrue(innerRingPt != null, "Unable to find a ring point not a node of the search ring"); bool isInside = CGAlgorithms.IsPointInRing(innerRingPt, searchRingPts); if (isInside) { nestedPt = innerRingPt; return(true); } return(false); }
/// <summary> /// /// </summary> /// <returns></returns> public bool IsNonNested() { BuildQuadtree(); for (int i = 0; i < _rings.Count; i++) { var innerRing = _rings[i]; var innerRingPts = innerRing.Coordinates; var results = _quadtree.Query(innerRing.EnvelopeInternal); for (int j = 0; j < results.Count; j++) { var searchRing = results[j]; var searchRingPts = searchRing.Coordinates; if (innerRing == searchRing) { continue; } if (!innerRing.EnvelopeInternal.Intersects(searchRing.EnvelopeInternal)) { continue; } var innerRingPt = IsValidOp.FindPointNotNode(innerRingPts, searchRing, _graph); Assert.IsTrue(innerRingPt != null, "Unable to find a ring point not a node of the search ring"); bool isInside = PointLocation.IsInRing(innerRingPt, searchRingPts); if (isInside) { _nestedPt = innerRingPt; return(false); } } } return(true); }