def _handle_crossing(self, event): self.il.append( event.point) # Add Es intersect point to the output list IL # Let segE1 above segE2 be E's intersecting segments in SL segment_e1 = event.segment_above segment_e2 = event.segment_below # Swap their positions so that segE2 is now above segE1; self.sweep_line.swap(segment_e1, segment_e2) segment_above_e2 = self.sweep_line.successor( segment_e2) # Let segA = the segment above segE2 in SL segment_below_e1 = self.sweep_line.predecessor( segment_e1) # Let segB = the segment below segE1 in SL if segment_above_e2: segment_above_e2 = segment_above_e2.value point = segment_above_e2.intersection_point(segment_e2) if point and point.x > event.point.x: self.event_queue.push( Event(point, Event.CROSSING, segment_above_e2, segment_e2)) if segment_below_e1: segment_below_e1 = segment_below_e1.value point = segment_below_e1.intersection_point(segment_e1) if point and point.x > event.point.x: self.event_queue.push( Event(point, Event.CROSSING, segment_e1, segment_below_e1))
def setUp(self): segment1 = Segment(0, 0, 4, 4) segment2 = Segment(1, 3, 3, 1) self.event1 = Event(segment1.pt1, Event.LEFT, segment1) self.event2 = Event(segment1.pt2, Event.RIGHT, segment1) self.event3 = Event(Point(2, 2), Event.CROSSING, segment2, segment1) segment3 = Segment(0, 0, 0, 1) segment4 = Segment(0, 0, 1, 0) self.event4 = Event(segment3.pt1, Event.VERTICAL, segment3) self.event5 = Event(segment4.pt1, Event.HORIZONTAL, segment4)
def __init__(self, segment_list): self.event_queue = PriorityQueue() # sorted along x self.sweep_line = SlowTree() # sorted along y for segment in segment_list: # Zalozone segment.pt1.x < segment.pt2.x. # Trzeba obsluzyc druga mozliwosc. if segment.pt1.x > segment.pt2.x: segment = ~segment self.event_queue.push(Event(segment.pt1, Event.LEFT, segment)) self.event_queue.push(Event(segment.pt2, Event.RIGHT, segment))
def __init__(self, segment_list): """Initialize structures.""" self.event_queue = [] # sorted along y self.sweep_line = AVLTree() # sorted along x for segment in segment_list: # O(n) time if segment.pt1 > segment.pt2: # (x1 > x2 and y1 = y2) or (x1 = x2 and y1 > y2) segment = ~segment if segment.pt1.x == segment.pt2.x: # vertical segment self.event_queue.append(Event(segment.pt1, Event.BOTTOM, segment)) self.event_queue.append(Event(segment.pt2, Event.TOP, segment)) elif segment.pt1.y == segment.pt2.y: # horizontal segment self.event_queue.append(Event(segment.pt1, Event.HORIZONTAL, segment)) else: raise ValueError("horizontal or vertical segments are allowed") self.event_queue.sort(key=lambda event: event.point.y) # O(n log n) time self.il = [] # intersection list
def _handle_left_endpoint(self, event): segment_e = event.segment # Let segE = E's segment self.sweep_line.insert(segment_e) # Add segE to SL segment_above = self.sweep_line.successor( segment_e) # Let segA = the segment Above segE in SL segment_below = self.sweep_line.predecessor( segment_e) # Let segB = the segment Below segE in SL if segment_above: # if exists segment_above = segment_above.value # get segment from node point = segment_e.intersection_point(segment_above) if point and point.x > event.point.x: self.event_queue.push( Event(point, Event.CROSSING, segment_above, segment_e)) if segment_below: # if exists segment_below = segment_below.value # get segment from node point = segment_e.intersection_point(segment_below) if point and point.x > event.point.x: self.event_queue.push( Event(point, Event.CROSSING, segment_e, segment_below))