/// <summary> /// /// </summary> /// <param name="start"></param> /// <param name="end"></param> /// <param name="ev0"></param> /// <param name="si"></param> private void ProcessOverlaps(int start, int end, SweepLineEvent ev0, SegmentIntersector si) { var ss0 = (SweepLineSegment)ev0.Object; /* * Since we might need to test for self-intersections, * include current INSERT event object in list of event objects to test. * Last index can be skipped, because it must be a Delete event. */ for (int i = start; i < end; i++) { var ev1 = _events[i]; if (ev1.IsInsert) { var ss1 = (SweepLineSegment)ev1.Object; // don't compare edges in same group, if labels are present if (!ev0.IsSameLabel(ev1)) { { ss0.ComputeIntersections(ss1, si); _nOverlaps++; } } } } }
/// <summary> /// /// </summary> /// <param name="edge"></param> /// <param name="edgeSet"></param> private void Add(Edge edge, object edgeSet) { var pts = edge.Coordinates; for (int i = 0; i < pts.Length - 1; i++) { var ss = new SweepLineSegment(edge, i); var insertEvent = new SweepLineEvent(edgeSet, ss.MinX, null); _events.Add(insertEvent); _events.Add(new SweepLineEvent(ss.MaxX, insertEvent)); } }
/// <summary> /// /// </summary> /// <param name="edge"></param> /// <param name="edgeSet"></param> private void AddEdge(Edge edge, object edgeSet) { var mce = edge.MonotoneChainEdge; int[] startIndex = mce.StartIndexes; for (int i = 0; i < startIndex.Length - 1; i++) { var mc = new MonotoneChain(mce, i); var insertEvent = new SweepLineEvent(edgeSet, mce.GetMinX(i), mc); _events.Add(insertEvent); _events.Add(new SweepLineEvent(mce.GetMaxX(i), insertEvent)); } }
/// <summary> /// Creates a DELETE event. /// </summary> /// <param name="x">The event location</param> /// <param name="insertEvent">The corresponding INSERT event</param> public SweepLineEvent(double x, SweepLineEvent insertEvent) { _eventType = Delete; _xValue = x; _insertEvent = insertEvent; }