예제 #1
0
    def test_mesh_plane_intersection(self):
        # x-z plane
        normal = np.array([0., 1., 0.])
        sample = np.array([0., 0., 0.])

        plane = Plane(sample, normal)

        # Verify that we're finding the correct number of faces to start with
        self.assertEqual(len(plane.mesh_intersecting_faces(self.box_mesh)), 8)

        xsections = plane.mesh_xsections(self.box_mesh)
        self.assertIsInstance(xsections, list)
        self.assertEqual(len(xsections), 1)
        self.assertEqual(len(xsections[0].v), 8)
        self.assertTrue(xsections[0].closed)

        self.assertEqual(xsections[0].total_length, 4.0)
        np.testing.assert_array_equal(xsections[0].v[:, 1], np.zeros((8, )))
        for a, b in zip(xsections[0].v[0:-1, [0, 2]], xsections[0].v[1:,
                                                                     [0, 2]]):
            # Each line changes only one coordinate, and is 0.5 long
            self.assertEqual(np.sum(a == b), 1)
            self.assertEqual(np.linalg.norm(a - b), 0.5)

        xsection = plane.mesh_xsection(self.box_mesh)
        self.assertEqual(len(xsection.v), 8)
        self.assertTrue(xsection.closed)
예제 #2
0
    def test_mesh_plane_intersection_with_no_intersection(self):
        # x-z plane
        normal = np.array([0., 1., 0.])
        sample = np.array([0., 5., 0.])

        plane = Plane(sample, normal)

        # Verify that we're detecting faces that lay entirely in the plane as potential intersections
        self.assertEqual(len(plane.mesh_intersecting_faces(self.box_mesh)), 0)

        xsections = plane.mesh_xsections(self.box_mesh)
        self.assertIsInstance(xsections, list)
        self.assertEqual(len(xsections), 0)

        xsection = plane.mesh_xsection(self.box_mesh)
        self.assertIsNone(xsection.v)
예제 #3
0
    def test_mesh_plane_intersection_wth_neighborhood(self):
        # x-z plane
        normal = np.array([0., 1., 0.])
        sample = np.array([0., 0., 0.])

        plane = Plane(sample, normal)

        two_box_mesh = self.double_mesh(self.box_mesh)

        xsections = plane.mesh_xsections(two_box_mesh,
                                         neighborhood=np.array([[0., 0., 0.]]))
        self.assertIsInstance(xsections, list)
        self.assertEqual(len(xsections), 1)
        self.assertEqual(len(xsections[0].v), 8)
        self.assertTrue(xsections[0].closed)

        xsection = plane.mesh_xsection(two_box_mesh,
                                       neighborhood=np.array([[0., 0., 0.]]))
        self.assertEqual(len(xsection.v), 8)
        self.assertTrue(xsection.closed)
예제 #4
0
    def test_mesh_plane_intersection_with_mulitple_non_watertight_meshes(self):
        # x-z plane
        normal = np.array([0., 1., 0.])
        sample = np.array([0., 0., 0.])

        plane = Plane(sample, normal)

        v_on_faces_to_remove = np.nonzero(self.box_mesh.v[:, 0] < 0.0)[0]
        faces_to_remove = np.all(np.in1d(self.box_mesh.f.ravel(),
                                         v_on_faces_to_remove).reshape(
                                             (-1, 3)),
                                 axis=1)
        open_mesh = MockMesh(
            v=self.box_mesh.v,
            f=self.box_mesh.f[np.logical_not(faces_to_remove)])
        two_open_meshes = self.double_mesh(open_mesh)

        xsections = plane.mesh_xsections(two_open_meshes)

        # The removed side is not in the xsection:
        self.assertFalse(any(np.all(xsections[0].v == [-0.5, 0., 0.], axis=1)))

        self.assertIsInstance(xsections, list)
        self.assertEqual(len(xsections), 2)
        self.assertEqual(len(xsections[0].v), 7)
        self.assertFalse(xsections[0].closed)
        self.assertEqual(len(xsections[1].v), 7)
        self.assertFalse(xsections[1].closed)

        self.assertEqual(xsections[0].total_length, 3.0)
        np.testing.assert_array_equal(xsections[0].v[:, 1], np.zeros((7, )))
        np.testing.assert_array_equal(xsections[1].v[:, 1], np.zeros((7, )))
        for a, b in zip(xsections[0].v[0:-1, [0, 2]], xsections[0].v[1:,
                                                                     [0, 2]]):
            # Each line changes only one coordinate, and is 0.5 long
            self.assertEqual(np.sum(a == b), 1)
            self.assertEqual(np.linalg.norm(a - b), 0.5)

        xsection = plane.mesh_xsection(two_open_meshes)
        self.assertEqual(len(xsection.v), 14)
        self.assertTrue(xsection.closed)