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