scipy PyVista网格三角剖分-顶点索引

fcy6dtqo  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(251)

我在PyVista中使用Delaunay 3D函数生成了一个三角形网格。我想计算网格的表面积,将所有三角形的面积相加。有没有办法从Delaunay结果中获得单纯形三角形的索引?

import pyvista as pv
cloud = pv.PolyData(points)
volume = cloud.delaunay_3d(alpha = 2.5)
shell = volume.extract_geometry()
shell.plot()

我知道我可以用Scipy来做这件事,但不管出于什么原因,Scipy生成了一个不正确的网格(并且没有我可以在Delaunay方法中调整的属性):

from scipy.spatial import Delaunay
tri = Delaunay(points)
print(tri.simplices)

[[386 466 377 613]
 [159 386 377 613]
 [159 386 466 613]
 ...
 [696 709 695 691]
 [696 710 711 691]
 [696 697 711 691]]

我的目标是遍历三角形并计算网格的表面积。

bfnvny8b

bfnvny8b1#

PyVista PolyData对象已经有一个area属性,该属性可以将单元格区域相加。
例如,考虑单位球面上的随机点:

import numpy as np
import pyvista as pv

# random point cloud on a unit sphere

rng = np.random.default_rng()
N = 1000 # points
thetas = rng.random(N)*np.pi
phis = rng.random(N)*2*np.pi
points = np.array([
    np.sin(thetas)*np.cos(phis),
    np.sin(thetas)*np.sin(phis),
    np.cos(thetas),
]).T

# triangulate and compute total area

mesh = pv.PolyData(points)
triangulated = mesh.delaunay_3d().extract_surface()
print(triangulated.area, 4*np.pi)

对我来说这印

12.47386243049973 12.566370614359172

第一个值是球体上三角点云的总面积,第二个值是完美单位球体的精确表面。看起来不错。
此外,还有其他类似的属性,例如,volume表示无间隙曲面(您拥有的):

>>> print(triangulated.volume, 4/3*np.pi)
4.127984347614561 4.1887902047863905

换句话说,如果只查找总面积,则不需要顶点索引。
(If如果你 * 确实 * 还想要顶点,那么可以通过triangulated.faces来获取信息。我的建议是查看triangulated.faces.reshape(-1, 4)[:, 1:],它是(n_cells, 3)形状的二维数组,其中每行对应一个给定的三角形,该行中的三个整数是构成相应三角形的三个点的索引。)

相关问题