private static void FindNewEvent(Segment s1, Segment s2, EventPoint eventPoint, RBTreeMap <EventPoint, LinkedList <Segment> > eventQueue) { //If two segments intersect below the sweep line, or on it and //to the right of the current event point, and the intersection //is not yet present as an event in Q: //then insert a new event point in Q for this intersection VecRat2 pointIntersection = new VecRat2(); SegRat2 segmentIntersection = new SegRat2(); //bool intersectionExists = Segment.ComputeIntersection(s1, s2, out pointIntersection); //if (intersectionExists) SegmentIntersectionType result = GeomAid.SegmentIntersection(s1.ToSegRat2(), s2.ToSegRat2(), ref pointIntersection, ref segmentIntersection); if (result == SegmentIntersectionType.Point) { EventPoint newEventPoint = new EventPoint(null); newEventPoint.Position = pointIntersection; if (eventPoint.CompareTo(newEventPoint) < 0 && !eventQueue.ContainsKey(newEventPoint)) { LinkedList <Segment> upperList = new LinkedList <Segment>(); eventQueue.Add(new RBTreeMapNode <EventPoint, LinkedList <Segment> >(newEventPoint, upperList)); } } else if (result == SegmentIntersectionType.Segment) { throw new NotImplementedException("Didn't think this would ever happen?!"); } }
public static LinkedList <LineSegmentIntersection> FindIntersections(IEnumerable <DCEL_HalfEdge> lineSegments) { LinkedList <LineSegmentIntersection> result = new LinkedList <LineSegmentIntersection>(); Sweepline sweepline = new Sweepline(); RBTreeMap <EventPoint, LinkedList <Segment> > eventQueue = new RBTreeMap <EventPoint, LinkedList <Segment> >((x, y) => x.CompareTo(y)); var segments = lineSegments.Where(lineSegment => lineSegment.Origin.Position != lineSegment.Destination.Position) .Select(lineSegment => new Segment(lineSegment, sweepline)); //segments = FixOverlappingSegments(segments); foreach (var segment in segments) { var node = eventQueue.Find(segment.Upper); LinkedList <Segment> upperList = (node != null ? node.Value : null); if (upperList == null) { upperList = new LinkedList <Segment>(); eventQueue.Add(new RBTreeMapNode <EventPoint, LinkedList <Segment> >(new EventPoint(segment.Upper), upperList)); } upperList.AddLast(segment); if (!eventQueue.ContainsKey(segment.Lower)) { eventQueue.Add(new RBTreeMapNode <EventPoint, LinkedList <Segment> >(new EventPoint(segment.Lower), new LinkedList <Segment>())); } } RBTreeSet <Segment> status = new RBTreeSet <Segment>((x, y) => x.CompareTo(y)); while (eventQueue.Count > 0) { var pair = eventQueue.MinNode; eventQueue.RemoveMin(); EventPoint nextEventPoint = pair.Key; LinkedList <Segment> upperList = pair.Value; LineSegmentIntersection reportedIntersection; HandleEventPoint(nextEventPoint, upperList, sweepline, eventQueue, status, out reportedIntersection); if (reportedIntersection != null) { result.AddLast(reportedIntersection); } } return(result); }