Index: src/Common/NetTopologySuite/Noding/IntersectionAdder.cs =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r5fc71a385897af92ccb092f2f969b5709afab85a --- src/Common/NetTopologySuite/Noding/IntersectionAdder.cs (.../IntersectionAdder.cs) (revision 8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9) +++ src/Common/NetTopologySuite/Noding/IntersectionAdder.cs (.../IntersectionAdder.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) @@ -19,38 +19,13 @@ /// /// /// - /// - /// - /// - public static bool IsAdjacentSegments(int i1, int i2) - { - return Math.Abs(i1 - i2) == 1; - } + public int NumIntersections = 0; - /** - * These variables keep track of what types of intersections were - * found during ALL edges that have been intersected. - */ - private bool hasIntersection = false; - private bool hasProper = false; - private bool hasProperInterior = false; - private bool hasInterior = false; - - // the proper intersection point found - private ICoordinate properIntersectionPoint = null; - - private LineIntersector li = null; - /// /// /// - public int NumIntersections = 0; - - /// - /// - /// public int NumInteriorIntersections = 0; - + /// /// /// @@ -61,12 +36,26 @@ /// public int NumTests = 0; + /** + * These variables keep track of what types of intersections were + * found during ALL edges that have been intersected. + */ + + // the proper intersection point found + + private readonly LineIntersector li = null; + /// /// Initializes a new instance of the class. /// /// public IntersectionAdder(LineIntersector li) { + HasInteriorIntersection = false; + HasProperInteriorIntersection = false; + HasProperIntersection = false; + HasIntersection = false; + ProperIntersectionPoint = null; this.li = li; } @@ -84,24 +73,12 @@ /// /// Returns the proper intersection point, or null if none was found. /// - public ICoordinate ProperIntersectionPoint - { - get - { - return properIntersectionPoint; - } - } + public ICoordinate ProperIntersectionPoint { get; private set; } /// /// /// - public bool HasIntersection - { - get - { - return hasIntersection; - } - } + public bool HasIntersection { get; private set; } /// /// A proper intersection is an intersection which is interior to at least two @@ -110,66 +87,29 @@ /// an endpoint equal to the intersection, which according to SFS semantics /// can result in the point being on the Boundary of the . /// - public bool HasProperIntersection - { - get - { - return hasProper; - } - } + public bool HasProperIntersection { get; private set; } /// /// A proper interior intersection is a proper intersection which is not /// contained in the set of boundary nodes set for this . /// - public bool HasProperInteriorIntersection - { - get - { - return hasProperInterior; - } - } - + public bool HasProperInteriorIntersection { get; private set; } + /// /// An interior intersection is an intersection which is /// in the interior of some segment. /// - public bool HasInteriorIntersection - { - get - { - return hasInterior; - } - } + public bool HasInteriorIntersection { get; private set; } /// - /// A trivial intersection is an apparent self-intersection which in fact - /// is simply the point shared by adjacent line segments. - /// Note that closed edges require a special check for the point shared by the beginning and end segments. + /// /// - /// - /// - /// - /// + /// + /// /// - private bool IsTrivialIntersection(SegmentString e0, int segIndex0, SegmentString e1, int segIndex1) + public static bool IsAdjacentSegments(int i1, int i2) { - if(e0 == e1) - { - if(li.IntersectionNum == 1) - { - if(IsAdjacentSegments(segIndex0, segIndex1)) - return true; - if (e0.IsClosed) - { - int maxSegIndex = e0.Count - 1; - if ( (segIndex0 == 0 && segIndex1 == maxSegIndex) || - (segIndex1 == 0 && segIndex0 == maxSegIndex) ) - return true; - } - } - } - return false; + return Math.Abs(i1 - i2) == 1; } /// @@ -187,39 +127,75 @@ public void ProcessIntersections(SegmentString e0, int segIndex0, SegmentString e1, int segIndex1) { if (e0 == e1 && segIndex0 == segIndex1) + { return; + } NumTests++; ICoordinate p00 = e0.Coordinates[segIndex0]; ICoordinate p01 = e0.Coordinates[segIndex0 + 1]; ICoordinate p10 = e1.Coordinates[segIndex1]; ICoordinate p11 = e1.Coordinates[segIndex1 + 1]; - li.ComputeIntersection(p00, p01, p10, p11); - if(li.HasIntersection) - { + li.ComputeIntersection(p00, p01, p10, p11); + if (li.HasIntersection) + { NumIntersections++; if (li.IsInteriorIntersection()) { NumInteriorIntersections++; - hasInterior = true; + HasInteriorIntersection = true; } // if the segments are adjacent they have at least one trivial intersection, // the shared endpoint. Don't bother adding it if it is the // only intersection. if (!IsTrivialIntersection(e0, segIndex0, e1, segIndex1)) { - hasIntersection = true; + HasIntersection = true; e0.AddIntersections(li, segIndex0, 0); e1.AddIntersections(li, segIndex1, 1); if (li.IsProper) { NumProperIntersections++; - hasProper = true; - hasProperInterior = true; + HasProperIntersection = true; + HasProperInteriorIntersection = true; } } } } + + /// + /// A trivial intersection is an apparent self-intersection which in fact + /// is simply the point shared by adjacent line segments. + /// Note that closed edges require a special check for the point shared by the beginning and end segments. + /// + /// + /// + /// + /// + /// + private bool IsTrivialIntersection(SegmentString e0, int segIndex0, SegmentString e1, int segIndex1) + { + if (e0 == e1) + { + if (li.IntersectionNum == 1) + { + if (IsAdjacentSegments(segIndex0, segIndex1)) + { + return true; + } + if (e0.IsClosed) + { + int maxSegIndex = e0.Count - 1; + if ((segIndex0 == 0 && segIndex1 == maxSegIndex) || + (segIndex1 == 0 && segIndex0 == maxSegIndex)) + { + return true; + } + } + } + } + return false; + } } -} +} \ No newline at end of file