def construct(self, points): """ Wykonuje właściwe działanie algorytmu poprzez obsługę zdarzeń typu zdarzenie punktowe oraz zdarzenie kołowe. Oprócz tego obługuje tworzenie się scen wizualizacji w miarę obsługiwania kolejnych eventów. :return: Scenes; lista obiektów typu Scene z narzędzia graficznego """ max_x = -float("inf") min_x = float("inf") for point in points: if point[0] > max_x: max_x = point[0] if point[0] < min_x: min_x = point[0] scenes = [] events = PriorityQueue() for s in self.diagram.sites: event = Event(s.point[1], EventType.site, site=s, point=s.point) events.put(event) not_valid_events = set() while not events.empty(): event = events.get() if event.type.value == 0: x_left, x_right = self.left_and_right_bound() edges = diagram_edges(self.diagram) parabolas = [] arc_list = self.beach_line.inorder() for node in arc_list: breakpoint_right = np.inf breakpoint_left = -np.inf if node.prev is not None: breakpoint_left = self.metric.compute_breakpoint( node.prev.site.point, node.site.point, event.point[1]) if node.next is not None: breakpoint_right = self.metric.compute_breakpoint( node.site.point, node.next.site.point, event.point[1]) p = (node.site.point[1] - event.point[1]) / 2 h = node.site.point[0] k = event.point[1] + p if p != 0: a = 1 / (4 * p) b = -(h / (2 * p)) c = (h**2) / (4 * p) + k if breakpoint_left > x_left and breakpoint_right < x_right: x = np.arange(breakpoint_left, breakpoint_right, 0.001) elif breakpoint_left < x_left and breakpoint_right < x_right: x = np.arange(x_left, breakpoint_right, 0.001) elif breakpoint_left > x_left and breakpoint_right > x_right: x = np.arange(breakpoint_left, x_right, 0.001) else: x = np.arange(x_left, x_right, 0.001) y = a * (x**2) + b * x + c points1 = list(zip(x, y)) parabolas.append(points1) result = [] for parabola in parabolas: for point in parabola: result.append(point) scenes.append( Vis.Scene([ Vis.PointsCollection([event.point], color='red'), Vis.PointsCollection(points, color='purple'), Vis.PointsCollection(result, s=3, color='green') ], [ Vis.LinesCollection([(( min_x, event.point[1], ), (max_x, event.point[1]))], color='brown'), Vis.LinesCollection(edges, color='red') ])) if event in not_valid_events: continue if event.type == EventType.site: self.handle_site_event(event, not_valid_events, events) else: self.handle_circle_event(event, not_valid_events, events) edges = diagram_edges(self.diagram) scenes.append( Vis.Scene([Vis.PointsCollection(points, color='purple')], [Vis.LinesCollection(edges, color='red')])) self.bound() edges = diagram_edges(self.diagram) scenes.append( Vis.Scene([Vis.PointsCollection(points, color='purple')], [Vis.LinesCollection(edges, color='red')])) return scenes