public static LandPolygon ExtractNeighborByStartingSegment ( LandPolygon parcel, LandPolygon neighbor, NeighborsSegment startingSegment ) { List <NeighborsSegment> intermediateNeighborSegments = parcel.GetCommonNeighborSegmentsByType(neighbor, TypeNeighbor.Intermediate); List <NeighborsSegment> endingNeighborSegments = parcel.GetCommonNeighborSegmentsByType(neighbor, TypeNeighbor.Ending); AcGe.Point2d backPoint = AcGe.Point2d.Origin; List <NeighborsSegment> nextSegments; NeighborsSegment nextSegment = startingSegment; LandPolygon neighborLine = new LandPolygon(neighbor.Info, false); int index = intermediateNeighborSegments.Count + endingNeighborSegments.Count; while (index != -1) { if ( nextSegment.TypeNeighbor == TypeNeighbor.Starting && nextSegment.TypeNeighbor != TypeNeighbor.OnlyOnePoint_Outside ) { neighborLine.Points.Add(nextSegment.FrontPoint); neighborLine.Points.Add(nextSegment.MediumPoint); } neighborLine.Points.Add(nextSegment.BackPoint); backPoint = nextSegment.BackPoint; if ( nextSegment.TypeNeighbor == TypeNeighbor.Ending && nextSegment.TypeNeighbor != TypeNeighbor.OnlyOnePoint_Outside ) { break; } nextSegments = FindNeighborSegments(intermediateNeighborSegments, backPoint); if (nextSegments.Count == 0) { nextSegments = FindNeighborSegments(endingNeighborSegments, backPoint); if (nextSegments.Count == 0 && startingSegment.MediumPoint.Equals(backPoint)) { neighborLine.Points.Add(startingSegment.FrontPoint); } } if (nextSegments.Count == 1) { nextSegment = nextSegments[0]; } index--; } return(neighborLine); }
public static List <NeighborsSegment> JoinAdjoiningSegments(List <NeighborsSegment> segments, bool isParcel) { if (segments == null) { return(null); } List <NeighborsSegment> resultSegments = new List <NeighborsSegment>(); if (segments.Count > 1) { NeighborsSegment newSegment; NeighborsSegment segmentBase; /* ReStart */ markReStart: int index = -1; while (segments.Count > 0) { index++; segmentBase = segments[0]; List <NeighborsSegment> segmentsFind = FindNeighborSegments(segments, segmentBase.MediumPoint); if (segmentsFind.Count > 1) { foreach (NeighborsSegment segmentFind in segmentsFind) { ResultComparePolygonSegments result = segmentBase.CompareSegments(segmentFind); if ( result.MediumPoint == CoincidencePoints.Coincides_With_Medium && !segmentBase.Equals(segmentFind) ) { if ( result.BackPoint == CoincidencePoints.Coincides_With_Nothing && result.FrontPoint == CoincidencePoints.Coincides_With_Nothing ) { newSegment = new NeighborsSegment(segmentFind.FrontPoint, segmentBase.MediumPoint, segmentBase.BackPoint, TypeNeighbor.Intermediate ); resultSegments.Add(newSegment); newSegment = new NeighborsSegment(segmentBase.FrontPoint, segmentBase.MediumPoint, segmentFind.BackPoint, TypeNeighbor.Intermediate ); } else { if (isParcel) { newSegment = segmentBase.JoinAdjoiningSegmentParcel(segmentFind); } else { newSegment = segmentBase.JoinAdjoiningSegmentNeighbor(segmentFind); } } bool rSb = segments.Remove(segments.Find(f => f.Equals(segmentBase))); bool rFs = segments.Remove(segments.Find(f => f.Equals(segmentFind))); resultSegments.Add(newSegment); /* * if ( * result.FrontPoint == CoincidencePoints.Coincides_With_Nothing && * result.BackPoint == CoincidencePoints.Coincides_With_Nothing * ) * { * if (isParcel) * { * newSegment = segmentBase.JoinAdjoiningSegmentParcel(segmentFind); * } * else * { * newSegment = segmentBase.JoinAdjoiningSegmentNeighbor(segmentFind); * } * resultSegments.Add((NeighborsSegment)newSegment); * * } */ goto markReStart; } } } else if (segmentsFind.Count == 1) { bool rSb = segments.Remove(segments.Find(f => f.Equals(segmentBase))); resultSegments.Add(segmentBase); } } } else { resultSegments = segments; } return(resultSegments); }