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)
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);
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)
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)
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);
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);
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)
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);
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)
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)
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)
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);
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);
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);
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)
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)
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);
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)
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)
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);
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);
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);
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);