예제 #1
0
    def test_get_segments_same_point(self):
        t = Polyline()
        points = [Point2D(0, 0), Point2D(0, 0), Point2D(2, 2)]
        for point in points:
            t.add(point)

        self.assertRaises(ValueError, t.get_segments)
    def test_find_polylines_one_point(self):
        point = Point2D(1, 1)
        polyline = Polyline()
        polyline.add(point)

        finder = PolylinesFinder(epsilon=0.5)
        self.assertListEqual(finder.find_polylines([point]), [polyline])
    def test_find_polylines_two_near_points(self):
        point1 = Point2D(1, 1)
        point2 = Point2D(1, 2)
        polyline = Polyline()
        polyline.add(point1)
        polyline.add(point2)

        finder = PolylinesFinder(epsilon=2)
        self.assertListEqual(finder.find_polylines([point1, point2]), [polyline])
예제 #4
0
    def test_get_segments_simple(self):
        t = Polyline()
        points = [Point2D(0, 0), Point2D(1, 1), Point2D(2, 2)]
        for point in points:
            t.add(point)

        self.assertListEqual(
            t.get_segments(),
            [Segment(points[0], points[1]),
             Segment(points[1], points[2])])
    def test_find_polylines_two_distant_polylines(self):
        points = [Point2D(1, 1), Point2D(1, 1.1), Point2D(2, 2), Point2D(2, 2.1)]
        polylines = [Polyline(), Polyline()]
        polylines[0].add(points[0])
        polylines[0].add(points[1])
        polylines[1].add(points[2])
        polylines[1].add(points[3])

        finder = PolylinesFinder(epsilon=0.5)
        self.assertListEqual(finder.find_polylines(points), [polylines[0], polylines[1]])
    def test_find_polyline_in_points_simple(self):
        points = [Point2D(0, 0), Point2D(1, 1), Point2D(2, 2), Point2D(3, 3)]

        polyline_reference = Polyline()
        polyline_reference.add(points[0])
        polyline_reference.add(points[3])

        finder = RDPSegmentsFinder(epsilon=0.5)
        polyline = finder.find_polyline_in_points(points)

        self.assertEqual(polyline, polyline_reference)
    def test_find_simple(self):
        point = Point2D(1, 1)
        polyline = Polyline()
        polyline.add(point)

        area = Area()
        area.add_object(Point2D, point)

        finder = PolylinesFinder(epsilon=0.5)
        finder.find(area)
        self.assertListEqual(area.get_objects(Polyline), [polyline])
    def test_find_simple(self):
        points = [Point2D(0, 0), Point2D(1, 1), Point2D(2, 2), Point2D(3, 3)]
        area = Area()
        polyline = Polyline()
        for point in points:
            polyline.add(point)

        area.add_object(Polyline, polyline)
        finder = RDPSegmentsFinder(epsilon=0.5)
        finder.find(area)

        self.assertListEqual(area.get_objects(Segment),
                             [Segment(points[0], points[-1])])
    def test_find_polylines_two_distant_points(self):
        point1 = Point2D(1, 1)
        point2 = Point2D(1, 2)
        polyline1 = Polyline()
        polyline1.add(point1)
        polyline2 = Polyline()
        polyline2.add(point2)

        finder = PolylinesFinder(epsilon=0.5)
        self.assertListEqual(finder.find_polylines([point1, point2]), [polyline1, polyline2])
예제 #10
0
    def find_polyline_in_points(self, points: List[Point2D]) -> Polyline:
        """
        Finds polyline in given points list, using The Ramer-Douglas-Peucker algorithm
        :param points: List of points
        :return: Polyline
        """
        points_lists = [[point.x, point.y] for point in points]
        mask = rdp(points_lists,
                   return_mask=True,
                   epsilon=self._epsilon,
                   dist=self._dist_function)

        main_points = [
            point for point, is_main in zip(points, mask) if is_main
        ]

        polyline = Polyline()

        for point in main_points:
            polyline.add(point)

        return polyline
    def test_find_segments_in_polylines_square(self):
        top = [Point2D(x, 0) for x in range(0, 5)]
        right = [Point2D(4, y) for y in range(1, 5)]
        bottom = [Point2D(x, 4) for x in range(3, 0, -1)]
        left = [Point2D(0, y) for y in range(4, 0, -1)]
        square = top + right + bottom + left

        polyline = Polyline()
        for point in square:
            polyline.add(point)

        segments_reference = {
            Segment(square[0], square[4]),
            Segment(square[4], square[8]),
            Segment(square[8], square[12]),
            Segment(square[12], square[15])
        }

        finder = RDPSegmentsFinder(epsilon=0.5)
        segments = finder.find_segments_in_polylines([polyline])

        self.assertSetEqual(set(segments), segments_reference)
예제 #12
0
    def find_polylines(self, points: List[Point2D]) -> List[Polyline]:

        if len(points) == 0:
            raise ValueError("There is no points")

        found_polylines = []
        current_polyline = Polyline()
        previous_point = None

        for current_point in points:
            if previous_point is not None and not self._accept_point(current_point, previous_point):
                found_polylines.append(current_polyline)
                current_polyline = Polyline()
            current_polyline.add(current_point)
            previous_point = current_point

        found_polylines.append(current_polyline)

        return found_polylines