class FindIntersections(): def __init__(self): self.Q = EventQueue() self.T = StatusStructure() self.intersections = [] def find_intersections(self, lines): for line in lines: self.Q.insert_line(line) while not self.Q.is_empty(): next_event = self.Q.pop_next_event() self.handle_event_point(next_event) def handle_event_point(self, p): U_p = p.lines L_p, C_p, L_C = self.T.find_segments_contain(p.point) U_C = U_p + C_p L_U_C = L_C + U_p if len(L_U_C) > 1: self.intersections.append(p.point) for line in L_C: self.T.delete(p.point, line) self.T.insert(p.point, U_C) self.T._print_name() if len(U_C) == 0: s_l = self.T.find_left_neighbor(p.point) s_r = self.T.find_right_neighbor(p.point) self.find_new_event(s_l, s_r, p.point) else: s_lm = self.T.find_leftmost(p.point) s_l = self.T.find_left_neighbor(p.point) self.find_new_event(s_lm, s_l, p.point) s_rm = self.T.find_rightmost(p.point) s_r = self.T.find_right_neighbor(p.point) self.find_new_event(s_rm, s_r, p.point) def find_new_event(self, s_l, s_r, p): if s_l is None or s_r is None: return i = s_l.intersect(s_r) if i is None: return x_i, y_i = i x_p, y_p = p if y_i < y_p or (y_i == y_p and x_i > x_p): self.Q.insert(i)