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