Esempio n. 1
0
        public static ICollection <IList <ITrimmedCurve> > ExtractChains(this ICollection <ITrimmedCurve> curveSegments)
        {
            var profiles       = new List <List <ITrimmedCurve> >();
            var unsortedCurves = new Queue <ITrimmedCurve>(curveSegments);

            while (unsortedCurves.Count > 0)
            {
                var profile = new List <ITrimmedCurve>();
                profile.Add(unsortedCurves.Dequeue());
                Point chainStart = profile[0].StartPoint;
                Point chainEnd   = profile[0].EndPoint;

                int counter = unsortedCurves.Count;
                while (chainStart != chainEnd && counter-- > 0)
                {
                    ITrimmedCurve candidate = unsortedCurves.Dequeue();

                    if (candidate.StartPoint == chainEnd)
                    {
                        profile.Add(candidate);
                        chainEnd = candidate.EndPoint;
                        counter  = unsortedCurves.Count;
                        continue;
                    }

                    if (candidate.EndPoint == chainEnd)
                    {
                        profile.Add(candidate.GetReverse());
                        chainEnd = candidate.StartPoint;
                        counter  = unsortedCurves.Count;
                        continue;
                    }

                    if (candidate.EndPoint == chainStart)
                    {
                        profile.Insert(0, candidate);
                        chainStart = candidate.StartPoint;
                        counter    = unsortedCurves.Count;
                        continue;
                    }

                    if (candidate.StartPoint == chainStart)
                    {
                        profile.Insert(0, candidate.GetReverse());
                        chainStart = candidate.EndPoint;
                        counter    = unsortedCurves.Count;
                        continue;
                    }

                    unsortedCurves.Enqueue(candidate);
                }

                if (profile.Count > 0)
                {
                    profiles.Add(profile);
                    profile = new List <ITrimmedCurve>();
                }
            }

            return(profiles.Cast <IList <ITrimmedCurve> >().ToArray());
        }