官网:https://pypi.org/project/potpourri3d/
Installation
Potpourri3d 位于 pypi 软件包索引中,其预编译二进制文件适用于大多数配置。像这样获取:
pip install potpourri3d
如果预编译的二进制文件与系统不匹配,pip 会尝试从头开始编译库。这需要 cmake 和可运行的 C++ 编译器工具链。
注意:某些绑定函数会在内部调用稀疏线性求解器。预编译二进制文件使用的是 Eigen 的求解器;使用 Suitesparse 的求解器可能会显著提高性能和鲁棒性。要获得这些求解器,请在安装了 Suitesparse 的机器上使用以下命令本地编译软件包(relevant docs)。
python -m pip install potpourri3d --no-binary potpourri3d
Input / Output
读取/写入一些常见格式的网格和点云。
- read_mesh(filename)
从文件中读取网格。返回 numpy 矩阵 V、F、一个 Nx3 的顶点实数 numpy 数组和一个 Mx3 的基于 0 的面索引整数 numpy 数组(或 Mx4 的四维网格等)。
filename 读取文件的路径。目前支持与 geometry-central 相同的文件类型。文件类型由路径扩展名自动推断。
- write_mesh(V, F, filename)
从文件写入网格。返回 numpy 矩阵 V、F、包含顶点的 Vx3 实数数组和包含基于 0 的面索引的 Fx3 整数数组(或四维网格的 Fx4 数组等)。
V 一个 Nx3 实数顶点数组;
F 以 0 为顶点索引的 Mx3 整数 numpy 面数组(或 Mx4 四维网格等);
filename 文件写入路径。目前支持与 geometry-central 相同的文件类型。文件类型会根据路径扩展名自动推断。
Mesh basic utilities
- face_areas(V,F)
为三角形网格计算一个长度为 F 的实数网格面面积数组。
- vertex_areas(V, F)
为三角形网格计算一个长度为 V 的实数顶点面积数组(等于入射面面积总和的 1/3)
- cotan_laplacian(V, F, denom_eps=0.)
以 VxV 实数稀疏 csr scipy 矩阵的形式计算 cotan-Laplace 矩阵。可选择将 denom_eps 设为 1e-6 这样的小值,以便在出现退化面时获得额外的稳定性。
Mesh Distance
使用大地测量距离的热法计算曲面上的大地测量距离。初始设置后可快速重复求解。内部使用固有三角剖分以提高稳健性。
import potpourri3d as pp3d
# = Stateful solves (much faster if computing distance many times)
solver = pp3d.MeshHeatMethodDistanceSolver(V,F)
dist = solver.compute_distance(7)
dist = solver.compute_distance_multisource([1,2,3])
# = One-off versions
dist = pp3d.compute_distance(V,F,7)
dist = pp3d.compute_distance_multisource(V,F,[1,3,4])
热量法的工作原理是求解形状表面上的一连串线性 PDE。如果发现这种情况,请考虑使用更精细的网格来提高精确度。(待办事项:在内部使用固有的 Delaunay 细化来实现)。
- MeshHeatMethodDistanceSolver(V, F, t_coef=1., use_robust=True)
构建求解器类的实例。
V 一个 Nx3 实数顶点数组
F 一个 Mx3 整数 numpy 数组,包含基于 0 的顶点索引(仅限三角形网格,但不必是流形)。
t_coef 设置用于短时热流的时间。一般情况下不要更改。如果有必要,较大的数值可能会使解法更加稳定,但代价是使解法更加平滑。
use_robust 使用内在三角剖分以提高稳健性。一般不启用。
- MeshHeatMethodDistanceSolver.compute_distance(v_ind)
计算单个顶点的距离,由基于零的索引给出。返回一个距离数组。
- MeshHeatMethodDistanceSolver.compute_distance_multisource(v_ind_list)
计算由基于零的索引列表给出的顶点集合中最近顶点的距离。返回一个距离数组。
- compute_distance(V, F, v_ind)
与上面的类似,不过是一次性的,而不是有状态的。返回一个距离数组。
- compute_distance_multisource(V, F, v_ind_list)
与上面的类似,不过是一次性的,而不是有状态的。返回一个距离数组。
Mesh Vector Heat
使用矢量热法(vector heat method)计算网格上的各种插值和基于矢量的数量。初始设置后可快速重复求解。
import potpourri3d as pp3d
# = Stateful solves
V, F = # a Nx3 numpy array of points and Mx3 array of triangle face indices
solver = pp3d.MeshVectorHeatSolver(V,F)
# Extend the value `0.` from vertex 12 and `1.` from vertex 17. Any vertex
# geodesically closer to 12. will take the value 0., and vice versa
# (plus some slight smoothing)
ext = solver.extend_scalar([12, 17], [0.,1.])
# Get the tangent frames which are used by the solver to define tangent data
# at each vertex
basisX, basisY, basisN = solver.get_tangent_frames()
# Parallel transport a vector along the surface
# (and map it to a vector in 3D)
sourceV = 22
ext = solver.transport_tangent_vector(sourceV, [6., 6.])
ext3D = ext[:,0,np.newaxis] * basisX + ext[:,1,np.newaxis] * basisY
# Compute the logarithmic map
logmap = solver.compute_log_map(sourceV)