Exemplo n.º 1
0
    def test_recs(self):
        r1 = Rectangle( (-1,-1), (8,7) )
        r2 = Rectangle((8.79, 2.144), (17.79, 11.144)).rotate(-10, around_origin=False)

        self.assertFalse(r1.overlaps(r2))
        self.assertFalse(r2.overlaps(r1))

        r2 = Rectangle((8.5, 2.144), (17.5, 11.144)).rotate(-10, around_origin=False)
        # edges=list(r2.edges())
        # self.assertEqual(len(edges), 4)
        # for e in edges:
        #     print e.p1, e.p2

        self.assertTrue(r1.overlaps(r2))
        self.assertTrue(r2.overlaps(r1))

        r = Rectangle((0.498, -12.082), (13.29, -0.124))
        npt.assert_allclose(r.center(), np.array([ 6.894, -6.103]))
        r1 = r.rotate(10, False)
        npt.assert_allclose(r1.center(), np.array([ 6.894, -6.103]))
        rcopy = r1.copy()
        npt.assert_allclose(rcopy.center(), np.array([ 6.894, -6.103]))
        rcopy = rcopy.rotate(-10, False)
        npt.assert_allclose(rcopy.center(), np.array([ 6.894, -6.103]))

        npt.assert_allclose(r1.center(), np.array([ 6.894, -6.103]))
        r2 = Rectangle((0,-12), (13,0)).rotate(20, False)
        self.assertTrue(r1.overlaps(r2))
        npt.assert_allclose(r1.center(), np.array([ 6.894, -6.103]))
        r2 = Rectangle((3,-9), (9,-5)).rotate(169, False)
        self.assertTrue(r1.overlaps(r2))
        r2 = Rectangle((13,-5), (19,-1)).rotate(169, False)
        self.assertTrue(r1.overlaps(r2))
        r2.move(np.array([1,0]))
        self.assertFalse(r1.overlaps(r2))

        r1 = Rectangle((3,-8), (18,-2)).rotate(0)
        r2 = r1.copy().rotate(90, around_origin=False)
        self.assertTrue(r1.overlaps(r2))
        r2.move(np.array([11,0]))
        self.assertFalse(r1.overlaps(r2))

        r1 = Rectangle((3,-8), (18,-2)).rotate(10,False)
        r2 = Rectangle((-5,-8), (10,-2)).rotate(280,False)
        self.assertTrue(r1.overlaps(r2))
        self.assertTrue(r2.overlaps(r1))

        r2.move(np.array([-3,0]))
        self.assertFalse(r1.overlaps(r2))
        self.assertFalse(r2.overlaps(r1))
Exemplo n.º 2
0
    def _get_cgal_elem(self):
        """
        Get a cgal geometry element representing this object, if any
        Width is only considered for Wire
        """
        from CGAL.CGAL_Kernel import \
            Segment_2,\
            Polygon_2,\
            Point_2,\
            Bbox_2,\
            Iso_rectangle_2,\
            do_intersect

        if isinstance(self, Swoop.Rectangle):
            rect = Rectangle(self.get_point(0), self.get_point(1), check=False)
            verts = list(rect.vertices_ccw())
            if self.get_rot() is not None:
                angle_obj = angle_match(self.get_rot())
                angle = math.radians(angle_obj['angle'])
                if angle_obj['mirrored']:
                    angle *= -1
                origin = rect.center()
                rmat = Rectangle.rotation_matrix(angle)
                for i, v in enumerate(verts):
                    verts[i] = np.dot(v - origin, rmat) + origin
            return Polygon_2(list(map(np2cgal, verts)))

        elif isinstance(self, Swoop.Wire):
            p1 = self.get_point(0)
            p2 = self.get_point(1)
            if self.get_width() is None or self.get_width() == 0:
                return Segment_2(np2cgal(p1), np2cgal(p2))
            else:
                # Wire has width
                # This is important to consider because wires can represent traces
                # When doing a query, it is important we can pick up the trace
                if p1[0] > p2[0]:
                    p1, p2 = p2, p1  # p1 is the left endpoint
                elif p1[0] == p2[0] and p1[1] > p2[1]:
                    p1, p2 = p2, p1  # or the bottom

                vec = (p2 - p1)
                vec /= np.linalg.norm(vec)  # Normalize
                radius = np.array(vec[1], -vec[0])
                radius *= self.get_width(
                ) / 2.0  # "Radius" of the wire, perpendicular to it

                vertices = []
                # Go around the vertices of the wire in CCW order
                # This should give you a rotated rectangle
                vertices.append(np2cgal(p1 + radius))
                vertices.append(np2cgal(p2 + radius))
                vertices.append(np2cgal(p2 - radius))
                vertices.append(np2cgal(p1 - radius))
                return Polygon_2(vertices)
        elif isinstance(self, Swoop.Polygon):
            return Polygon_2(
                [np2cgal(v.get_point()) for v in self.get_vertices()])
        else:
            return None
Exemplo n.º 3
0
    def _get_cgal_elem(self):
        """
        Get a cgal geometry element representing this object, if any
        Width is only considered for Wire
        """
        from CGAL.CGAL_Kernel import \
            Segment_2,\
            Polygon_2,\
            Point_2,\
            Bbox_2,\
            Iso_rectangle_2,\
            do_intersect

        if isinstance(self, Swoop.Rectangle):
            rect = Rectangle(self.get_point(0), self.get_point(1), check=False)
            verts = list(rect.vertices_ccw())
            if self.get_rot() is not None:
                angle_obj = angle_match(self.get_rot())
                angle = math.radians(angle_obj['angle'])
                if angle_obj['mirrored']:
                    angle *= -1
                origin = rect.center()
                rmat = Rectangle.rotation_matrix(angle)
                for i,v in enumerate(verts):
                    verts[i] = np.dot(v - origin, rmat) + origin
            return Polygon_2(map(np2cgal, verts))

        elif isinstance(self, Swoop.Wire):
            p1 = self.get_point(0)
            p2 = self.get_point(1)
            if self.get_width() is None or self.get_width() == 0:
                return Segment_2(np2cgal(p1), np2cgal(p2))
            else:
                # Wire has width
                # This is important to consider because wires can represent traces
                # When doing a query, it is important we can pick up the trace
                if p1[0] > p2[0]:
                    p1,p2 = p2,p1   # p1 is the left endpoint
                elif p1[0]==p2[0] and p1[1] > p2[1]:
                    p1,p2 = p2,p1   # or the bottom

                vec = (p2 - p1)
                vec /= np.linalg.norm(vec)          # Normalize
                radius = np.array(vec[1], -vec[0])
                radius *= self.get_width()/2.0     # "Radius" of the wire, perpendicular to it

                vertices = []
                # Go around the vertices of the wire in CCW order
                # This should give you a rotated rectangle
                vertices.append(np2cgal( p1 + radius ))
                vertices.append(np2cgal( p2 + radius ))
                vertices.append(np2cgal( p2 - radius ))
                vertices.append(np2cgal( p1 - radius ))
                return Polygon_2(vertices)
        elif isinstance(self, Swoop.Polygon):
            return Polygon_2([np2cgal(v.get_point()) for v in self.get_vertices()])
        else:
            return None