예제 #1
0
 def test_intersecting_cubes(self):
     mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([2, 2, 2]))
     mesh_2 = generate_box_mesh(np.array([1, 1, 1]), np.array([3, 3, 3]))
     mesh = merge_meshes((mesh_1, mesh_2))
     outer_hull = compute_outer_hull(mesh)
     self.assertTrue(outer_hull.is_closed())
     self.assert_valid_attributes(mesh, outer_hull)
예제 #2
0
 def test_intersecting_cubes(self):
     mesh_1 = generate_box_mesh(
             np.array([0, 0, 0]), np.array([2, 2, 2]));
     mesh_2 = generate_box_mesh(
             np.array([1, 1, 1]), np.array([3, 3, 3]));
     mesh = merge_meshes((mesh_1, mesh_2));
     outer_hull = compute_outer_hull(mesh);
     self.assertTrue(outer_hull.is_closed());
     self.assert_valid_attributes(mesh, outer_hull);
예제 #3
0
    def test_corner_corner_touch(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))
        mesh_2 = generate_box_mesh(np.array([1, 1, 1]), np.array([4, 4, 4]))
        mesh = merge_meshes((mesh_1, mesh_2))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        self.assert_no_self_intersect(output_mesh)
        self.assert_even_adj_faces(output_mesh)
예제 #4
0
    def test_face_face_touch_with_different_area(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))
        mesh_2 = generate_box_mesh(np.array([-1, -1, 1]), np.array([2, 2, 2]))

        mesh = merge_meshes((mesh_1, mesh_2))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh)
예제 #5
0
    def test_corner_corner_touch(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));
        mesh_2 = generate_box_mesh(
                np.array([1, 1, 1]), np.array([4, 4, 4]));
        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #6
0
    def test_simple_intersection(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([2, 2, 2]));
        mesh_2 = generate_box_mesh(
                np.array([1, 1, 1]), np.array([4, 4, 4]));
        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #7
0
    def test_face_face_touch(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))
        mesh_2 = generate_box_mesh(np.array([0, 0, 1]), np.array([1, 1, 2]))

        mesh = merge_meshes((mesh_1, mesh_2))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        # Since the overlapping faces would be kept so valid nested outer hulls
        # can be extracted, the resolved mesh would be actually self-intersecting.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh)
예제 #8
0
    def test_face_face_touch_with_different_area(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));
        mesh_2 = generate_box_mesh(
                np.array([-1, -1, 1]), np.array([2, 2, 2]));

        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #9
0
    def test_no_intersection(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))
        mesh_2 = generate_box_mesh(np.array([3, 3, 3]), np.array([4, 4, 4]))
        mesh = merge_meshes((mesh_1, mesh_2))

        intersecting_faces = detect_self_intersection(mesh)
        self.assertEqual(0, len(intersecting_faces))

        output_mesh = resolve_self_intersection(mesh)
        self.assertEqual(mesh.num_vertices, output_mesh.num_vertices)
        self.assertEqual(mesh.num_faces, output_mesh.num_faces)
        self.assert_even_adj_faces(output_mesh)
예제 #10
0
    def test_cross_union(self):
        mesh_1 = generate_box_mesh(np.array([-2, -1, -1]), np.array([2, 1, 1]))
        mesh_2 = generate_box_mesh(np.array([-1, -2, -1]), np.array([1, 2, 1]))
        mesh_3 = generate_box_mesh(np.array([-1, -1, -2]), np.array([1, 1, 2]))

        mesh = merge_meshes((mesh_1, mesh_2, mesh_3))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        # The output mesh contains duplicated faces due to input overlaps.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh)
예제 #11
0
    def test_multiple_components(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))
        mesh_2 = generate_box_mesh(np.array([2, 2, 2]), np.array([3, 3, 3]))

        mesh = merge_meshes((mesh_1, mesh_2))
        outer_hulls = compute_outer_hull(mesh, all_layers=True)
        self.assertEqual(1, len(outer_hulls))
        outer_hull = outer_hulls[0]

        self.assertTrue(outer_hull.is_closed())
        self.assertEqual(2, outer_hull.num_components)
        self.assert_valid_attributes(mesh, outer_hull)
예제 #12
0
    def test_multiple_components(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));
        mesh_2 = generate_box_mesh(
                np.array([2, 2, 2]), np.array([3, 3, 3]));

        mesh = merge_meshes((mesh_1, mesh_2));
        outer_hulls = compute_outer_hull(mesh, all_layers=True);
        self.assertEqual(1, len(outer_hulls));
        outer_hull = outer_hulls[0];

        self.assertTrue(outer_hull.is_closed());
        self.assertEqual(2, outer_hull.num_components);
        self.assert_valid_attributes(mesh, outer_hull);
예제 #13
0
    def test_no_intersection(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));
        mesh_2 = generate_box_mesh(
                np.array([3, 3, 3]), np.array([4, 4, 4]));
        mesh = merge_meshes((mesh_1, mesh_2));

        intersecting_faces = detect_self_intersection(mesh);
        self.assertEqual(0, len(intersecting_faces));

        output_mesh = resolve_self_intersection(mesh);
        self.assertEqual(mesh.num_vertices, output_mesh.num_vertices);
        self.assertEqual(mesh.num_faces, output_mesh.num_faces);
        self.assert_even_adj_faces(output_mesh);
예제 #14
0
    def test_face_face_touch(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));
        mesh_2 = generate_box_mesh(
                np.array([0, 0, 1]), np.array([1, 1, 2]));

        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        # Since the overlapping faces would be kept so valid nested outer hulls
        # can be extracted, the resolved mesh would be actually self-intersecting.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #15
0
    def test_rotate_120(self):
        mesh_1 = generate_box_mesh(np.array([-2, -1, -1]), np.array([2, 1, 1]))

        rot = Quaternion.fromAxisAngle(np.array([1.0, 0.0, 0.0]),
                                       float(2 * math.pi) / 3)
        mesh_2 = form_mesh(
            np.dot(rot.to_matrix(), mesh_1.vertices.T).T, mesh_1.faces)

        mesh = merge_meshes((mesh_1, mesh_2))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        # The output mesh contains degenerated face.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh)
예제 #16
0
    def test_face_corner_touch_off_center(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))

        rot = Quaternion.fromData(np.array([1, 1, 1], dtype=float),
                                  np.array([0, 0, 1], dtype=float))
        mesh_2 = form_mesh(
            np.dot(rot.to_matrix(), mesh_1.vertices.T).T +
            np.array([0.6, 0.6, 1.0]), mesh_1.faces)

        mesh = merge_meshes((mesh_1, mesh_2))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        self.assert_no_self_intersect(output_mesh)
        self.assert_even_adj_faces(output_mesh)
예제 #17
0
    def test_cross_union(self):
        mesh_1 = generate_box_mesh(
                np.array([-2, -1, -1]), np.array([2, 1, 1]));
        mesh_2 = generate_box_mesh(
                np.array([-1, -2, -1]), np.array([1, 2, 1]));
        mesh_3 = generate_box_mesh(
                np.array([-1, -1, -2]), np.array([1, 1, 2]));

        mesh = merge_meshes((mesh_1, mesh_2, mesh_3));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        # The output mesh contains duplicated faces due to input overlaps.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #18
0
    def test_nested_cubes(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([3, 3, 3]))
        mesh_2 = generate_box_mesh(np.array([1, 1, 1]), np.array([2, 2, 2]))

        mesh = merge_meshes((mesh_1, mesh_2))
        outer_hulls = compute_outer_hull(mesh, all_layers=True)
        self.assertEqual(2, len(outer_hulls))
        outer_hull = outer_hulls[0]
        interior_mesh = outer_hulls[1]

        self.assertTrue(outer_hull.is_closed())
        self.assertEqual(1, outer_hull.num_components)
        self.assert_valid_attributes(mesh, outer_hull)

        self.assertEqual(8, interior_mesh.num_vertices)
        self.assert_array_equal(([1, 1, 1], [2, 2, 2]), interior_mesh.bbox)
예제 #19
0
    def test_intersect_with_rotated_self(self):
        mesh_1 = generate_box_mesh(np.array([0, 0, 0]), np.array([1, 1, 1]))

        rot = Quaternion.fromAxisAngle(np.array([1, 1, 0], dtype=float),
                                       math.pi * 0.5)
        mesh_2 = form_mesh(
            np.dot(rot.to_matrix(), mesh_1.vertices.T).T +
            np.array([0.5, 0.5, 0.5]), mesh_1.faces)

        mesh = merge_meshes((mesh_1, mesh_2))
        output_mesh = resolve_self_intersection(mesh)

        self.assert_self_intersect(mesh)
        # The output mesh contains degenerated triangles, which cause CGAL
        # assertion failure.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh)
예제 #20
0
    def test_rotate_120(self):
        mesh_1 = generate_box_mesh(
                np.array([-2, -1, -1]), np.array([2, 1, 1]));

        rot = Quaternion.fromAxisAngle(
                np.array([1.0, 0.0, 0.0]), float(2*math.pi) / 3);
        mesh_2 = form_mesh(
                np.dot(rot.to_matrix(), mesh_1.vertices.T).T,
                mesh_1.faces);

        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        # The output mesh contains degenerated face.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #21
0
    def test_face_corner_touch_off_center(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));

        rot = Quaternion.fromData(
                np.array([1, 1, 1], dtype=float),
                np.array([0, 0, 1], dtype=float));
        mesh_2 = form_mesh(
                np.dot(rot.to_matrix(), mesh_1.vertices.T).T +
                np.array([0.6, 0.6, 1.0]),
                mesh_1.faces);

        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #22
0
    def test_intersect_with_rotated_self(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([1, 1, 1]));

        rot = Quaternion.fromAxisAngle(np.array([1, 1, 0], dtype=float),
                math.pi * 0.5);
        mesh_2 = form_mesh(
                np.dot(rot.to_matrix(), mesh_1.vertices.T).T +
                np.array([0.5, 0.5, 0.5]),
                mesh_1.faces);

        mesh = merge_meshes((mesh_1, mesh_2));
        output_mesh = resolve_self_intersection(mesh);

        self.assert_self_intersect(mesh);
        # The output mesh contains degenerated triangles, which cause CGAL
        # assertion failure.
        #self.assert_no_self_intersect(output_mesh);
        self.assert_even_adj_faces(output_mesh);
예제 #23
0
    def test_nested_cubes(self):
        mesh_1 = generate_box_mesh(
                np.array([0, 0, 0]), np.array([3, 3, 3]));
        mesh_2 = generate_box_mesh(
                np.array([1, 1, 1]), np.array([2, 2, 2]));

        mesh = merge_meshes((mesh_1, mesh_2));
        outer_hulls = compute_outer_hull(mesh, all_layers=True);
        self.assertEqual(2, len(outer_hulls));
        outer_hull = outer_hulls[0];
        interior_mesh = outer_hulls[1];

        self.assertTrue(outer_hull.is_closed());
        self.assertEqual(1, outer_hull.num_components);
        self.assert_valid_attributes(mesh, outer_hull);

        self.assertEqual(8, interior_mesh.num_vertices);
        self.assert_array_equal(([1, 1, 1], [2, 2, 2]),
                interior_mesh.bbox);