Resolve all self-intersections. Args: mesh (:py:class:`Mesh`): The input mesh. Only triangular mesh is supported. engine (``string``): (optional) Self-intersection engine. Valid engines include: * ``auto``: the default engine (default is `
(mesh, engine="auto")
| 3 | from .meshio import form_mesh |
| 4 | |
| 5 | def resolve_self_intersection(mesh, engine="auto"): |
| 6 | """ Resolve all self-intersections. |
| 7 | |
| 8 | Args: |
| 9 | mesh (:py:class:`Mesh`): The input mesh. Only triangular mesh is |
| 10 | supported. |
| 11 | engine (``string``): (optional) Self-intersection engine. Valid engines |
| 12 | include: |
| 13 | |
| 14 | * ``auto``: the default engine (default is ``igl``). |
| 15 | * ``igl``: `libigl's self-intersection engine |
| 16 | <https://github.com/libigl/libigl>`_ |
| 17 | |
| 18 | Returns: |
| 19 | A triangular :py:class:`Mesh` with all self-intersection resolved. The |
| 20 | following per-face scalar field is defined: |
| 21 | |
| 22 | * ``face_sources``: For each output face, this field specifies the index |
| 23 | of the corresponding "source face" in the input mesh. |
| 24 | |
| 25 | """ |
| 26 | if engine == "auto": |
| 27 | engine = "igl" |
| 28 | |
| 29 | vertices = mesh.vertices |
| 30 | faces = mesh.faces |
| 31 | if mesh.dim == 2: |
| 32 | vertices = np.hstack((vertices, |
| 33 | np.zeros((mesh.num_vertices, 1), dtype=float))) |
| 34 | elif mesh.dim != 3: |
| 35 | raise NotImplementedError( |
| 36 | "Resolving self-intersection only support 2D and 3D meshes") |
| 37 | if mesh.vertex_per_face != 3: |
| 38 | raise NotImplementedError( |
| 39 | "Resolving self-intersection only support triangle meshes") |
| 40 | |
| 41 | resolver = PyMesh.SelfIntersectionResolver.create(engine) |
| 42 | resolver.set_mesh(vertices, faces) |
| 43 | resolver.run() |
| 44 | |
| 45 | vertices = resolver.get_vertices() |
| 46 | faces = resolver.get_faces() |
| 47 | |
| 48 | if mesh.dim == 2: |
| 49 | vertices = vertices[:,[0,1]] |
| 50 | |
| 51 | output_mesh = form_mesh(vertices, faces) |
| 52 | face_sources = resolver.get_face_sources() |
| 53 | output_mesh.add_attribute("face_sources") |
| 54 | output_mesh.set_attribute("face_sources", face_sources) |
| 55 | |
| 56 | return output_mesh |
| 57 | |
| 58 | def detect_self_intersection(mesh): |
| 59 | """ Detect all self-intersections. |