Exemple #1
0
class Broom:
    epsilon = 10**(-10)

    def __init__(self):
        self.x = 0
        self.rb_tree = None
        self.heap = None
        self.intersections_tree = None
        self.intersections_array = []
        self.intersections_tmp = []

    def intersections_insert(self, point, segment1, segment2):
        if self.intersections_tree is None:
            self.intersections_tree = DuplicateRedBlackTree()

        if point is not None and self.intersections_tree.find_node(point) is None:
            self.intersections_tree.insert(point)
            self.heap_insert_intersection(point, segment1, segment2)
            self.intersections_array.append(point)
            self.intersections_tmp.append((point, segment1, segment2))

    def intersections_in_order(self):
        self.intersections_tree.in_order()

    def intersections_find(self, point):
        return self.intersections_tree.find_node(point)

    def heap_insert_point(self, point, segment):
        if segment.p == point:
            state = 0
        else:
            state = 1

        if self.heap is None:
            self.heap = []

        node = HeapNode(point, segment, state)
        heappush(self.heap, node)

    def heap_insert_intersection(self, point, segment1, segment2):
        if self.heap is None:
            self.heap = []

        node = HeapNode(point, segment1, 2, segment2)
        heappush(self.heap, node)

    def heap_take_min(self):
        return heappop(self.heap)

    def root_insert(self, segment, bottom_segment=None):
        if self.rb_tree is None:
            self.rb_tree = RedBlackTree()
        self.rb_tree.insert(segment, bottom_segment, x=self.x)

    def root_delete(self, segment, state=None):
        if state is None:
            self.rb_tree.delete(segment, x=self.x)
        elif state == 2:
            self.rb_tree.delete(segment, x=self.x)

    def root_in_order(self):
        self.rb_tree.in_order()

    def root_find(self, segment):
        if self.rb_tree is None:
            return None
        segment.key = segment.update_key(self.x)
        return self.rb_tree.find_node(segment.key, x=self.x)

    def root_successor(self, segment):
        segment.key = segment.update_key(self.x)
        curr_node = self.rb_tree.find_node(segment.key, x=self.x)
        if curr_node.bottom_segment is not None and curr_node.bottom_segment == segment:
            return curr_node.segment
        else:
            succ_node = self.rb_tree.successor(curr_node)
            if succ_node is None:
                return None
            return succ_node.bottom_segment if succ_node.bottom_segment is not None else succ_node.segment

    def root_predecessor(self, segment):
        segment.key = segment.update_key(self.x)
        curr_node = self.rb_tree.find_node(segment.key, x=self.x)
        if curr_node.bottom_segment is not None and curr_node.segment == segment:
            return curr_node.bottom_segment
        else:
            pred_node = self.rb_tree.predecessor(curr_node)
            if pred_node is None:
                return None
            return pred_node.segment