Compute winding number with respect to `mesh` at `queries`. Args: mesh (:class:`Mesh`): The mesh for which winding number is evaluated. queries (:class:`numpy.ndarray`): N by 3 matrix of query points at which winding number is evaluated. engine (``string``):
(mesh, queries, engine="auto")
| 1 | import PyMesh |
| 2 | |
| 3 | def compute_winding_number(mesh, queries, engine="auto"): |
| 4 | """ Compute winding number with respect to `mesh` at `queries`. |
| 5 | |
| 6 | Args: |
| 7 | mesh (:class:`Mesh`): The mesh for which winding number is evaluated. |
| 8 | queries (:class:`numpy.ndarray`): N by 3 matrix of query points at which |
| 9 | winding number is evaluated. |
| 10 | engine (``string``): (optional) Winding number computing engine name: |
| 11 | |
| 12 | * ``auto``: use default engine (which is ``igl``). |
| 13 | * ``igl``: use libigl's `generalized winding number`_. |
| 14 | * ``fast_winding_number``: use code from `fast winding number`_ |
| 15 | paper. It is faster than ``igl`` but can be less accurate sometimes. |
| 16 | |
| 17 | |
| 18 | Returns: |
| 19 | A list of size N, represent the winding numbers at each query points in |
| 20 | order. |
| 21 | |
| 22 | .. _`generalized winding number`: https://libigl.github.io/tutorial/#generalized-winding-number |
| 23 | .. _`fast winding number`: http://www.dgp.toronto.edu/projects/fast-winding-numbers/ |
| 24 | """ |
| 25 | assert(mesh.dim == 3) |
| 26 | assert(mesh.vertex_per_face == 3) |
| 27 | |
| 28 | if engine == "auto": |
| 29 | engine = "igl" |
| 30 | |
| 31 | engine = PyMesh.WindingNumberEngine.create(engine) |
| 32 | engine.set_mesh(mesh.vertices, mesh.faces) |
| 33 | winding_numbers = engine.run(queries).ravel() |
| 34 | |
| 35 | return winding_numbers |