我要寻找的Voronoi图具有一个人类表面的点云。因此,我发现了scipy.spatial.Voronoi()
,其中包括一些相当不错的documentation。但是有时vor.regions
包含空白区域,而文档并没有完全解释它们为何存在。充其量,它解释了与Delaunay计算的关系。“请注意,由于与上述Delaunay三角剖分类似的数值精度问题,Voronoi区域可能少于输入点。”但是如果是这样,这是因为qhull使用与Delaunay Triangulation相似(或完全相同)的算法来计算Voronoi。从数学上讲,Voronoi地区应该为空的唯一原因是它的点是否重复
我希望复制this paper的结果,这些结果使用Voronoi图在每个输入点计算法线向量。因此,我可以做一个变通办法,在其中使用与附近点的正确计算出的法线相似的法线,或者我可以忽略给出零Voronoi区域的点。但是我真的很想知道如何解决这些空白区域,以便我可以使用尽可能多的输入数据。
This answer建议Voronoi(points, qhull_options='Qbb Qc Qx')
,在docs中建议qhull_options="QJ Pp"
输入数据:http://columbia.edu/~nxb2101/minimal_stickfig_.npy
import numpy as np; np.set_err(all='raise')
import scipy.spatial
pt_cloud=np.load('minimal_stickfig_.npy')
vor=scipy.spatial.Voronoi(pt_cloud)
for idx in range(len(vor.regions)):
region=vor.regions[idx]
vertices = vor.vertices[region]
hull=scipy.spatial.ConvexHull(vertices)
volume=hull.volume
triangle_mesh_hull=vertices[hull.simplices] # (n,3,3)
# triang mesh calculation taken from
# https://stackoverflow.com/questions/26434726/return-surface-triangle-of-3d-scipy-spatial-delaunay/26516915
inner_pt = np.mean(vertices[:2],axis=0).reshape((1,3))
CoM=np.zeros((3,))
pif("inner_pt is {0}".format(inner_pt))
for triangle in triangle_mesh_hull:
pif("triangle is: \n{0}".format(triangle))
tetra=np.concatenate((inner_pt,triangle),axis=0)
CoM_tetra=np.mean(tetra,axis=0)
vol_tetra=volume_tetra(tetra)
CoM+=(CoM_tetra*vol_tetra)
CoM /= volume
# do more with CoM, and volume
任何帮助都值得赞赏;如果您不确定为什么qhull会这样做或如何解决它,请让我知道您从点云制作高质量网格所做的工作