Ejemplo n.º 1
0
        // This creates the VisibilityVertex objects along the segments.
        internal VisibilityGraph Generate(IEnumerable <ScanSegment> hSegments, IEnumerable <ScanSegment> vSegments)
        {
            foreach (ScanSegment seg in vSegments)
            {
                eventList.Add(new SegEvent(SegEventType.VOpen, seg));
                eventList.Add(new SegEvent(SegEventType.VClose, seg));
            }
            foreach (ScanSegment seg in hSegments)
            {
                eventList.Add(new SegEvent(SegEventType.HOpen, seg));
            }

            if (0 == eventList.Count)
            {
                return(null); // empty
            }
            eventList.Sort(this);

            // Note: We don't need any sentinels in the scanline here, because the lowest VOpen
            // events are loaded before the first HOpen is.

            // Process all events.
            visGraph = VisibilityGraphGenerator.NewVisibilityGraph();
            foreach (SegEvent evt in eventList)
            {
                switch (evt.EventType)
                {
                case SegEventType.VOpen:
                    OnSegmentOpen(evt.Segment);
                    ScanInsert(evt.Segment);
                    break;

                case SegEventType.VClose:
                    OnSegmentClose(evt.Segment);
                    ScanRemove(evt.Segment);
                    break;

                case SegEventType.HOpen:
                    OnSegmentOpen(evt.Segment);
                    ScanIntersect(evt.Segment);
                    break;

                default:
                    Debug.Assert(false, "Unknown SegEventType");
// ReSharper disable HeuristicUnreachableCode
                    break;
// ReSharper restore HeuristicUnreachableCode
                }
            } // endforeach
            return(visGraph);
        }