Beispiel #1
0
    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))
Beispiel #2
0
 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)
Beispiel #3
0
    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))
Beispiel #4
0
    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
Beispiel #5
0
    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))