Beispiel #1
0
    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