Source code for meshparty.mesh_skel_utils
import numpy as np
from scipy import sparse
import trimesh
from . import utils
[docs]def point_to_skel_meshpath(mesh, sk, pt, filterpts=None):
'''
Given a mesh, a skeleton and a point, find the path along the mesh between a point
on the mesh and the skeleton (closest skeleton point). If the point is not on the mesh,
the point used is the mesh vertex that is closest to the point.
Parameters
----------
mesh: meshparty.trimesh_io.Mesh
Trimesh-like mesh with N vertices
sk: meshparty.trimesh_io.Mesh
Skeleton whose vertices are a subset of the vertices of mesh
pt : 1 x 3 numpy.array
Array specifying a point location
filterpts: Bool array
Filter that was used to generate "mesh",
If "mesh" is a filtered version of the mesh that was used to generate the skeleton "sk".
If sk was generated from mesh as is, then use filter=None.
Returns
-------
path: int array
Indices of vertices on mesh which trace the path from the point (pt) to the skeleton (sk)
'''
if 'mesh_index' in sk.vertex_properties:
mesh_index = sk.vertex_properties['mesh_index']
else:
mesh_index = sk.mesh_index
if filterpts is None:
sk_inds = [val for i, val in enumerate(mesh_index) if not val == -1]
else:
validinds = np.where(filterpts)[0]
# intersection of validinds and sk.vertex_properties['mesh_index']
localskeletoninds = list(
set(mesh_index) & set(validinds))
sk_inds = [i for i, val in enumerate(
validinds) if val in localskeletoninds]
if len(sk_inds) < 1:
return None
else:
closest_point, distance, tid = trimesh.proximity.closest_point(
mesh, [[pt[0], pt[1], pt[2]]])
pointindex = mesh.faces[tid][0][0]
dm, preds, sources = sparse.csgraph.dijkstra(
mesh.csgraph, False, [pointindex],
min_only=True, return_predecessors=True)
min_node = np.argmin(dm[sk_inds])
path = utils.get_path(pointindex, sk_inds[min_node], preds)
return path