我有一个人类表面的点云,我正试图找到它的沃罗诺图。所以我找到了scipy.spatial.Voronoi()
,包括一些非常好的documentation。但有时vor.regions
包含空区域,文档并不能很好地解释它们为什么存在。充其量,它解释了与Delaunay计算的关系“注意,由于与上面的Delaunay三角剖分类似的数值精度问题,Voronoi区域可能比输入点少。”但如果是这样,那只是因为qhull使用与Delaunay三角剖分相似(或完全相同)的算法来计算Voronoi发生这种事。从数学上讲,Voronoi区域应该为空的唯一原因是它的点是重复的
我希望复制this paper的结果,这些结果使用Voronoi图来计算每个输入点的法向量。所以我可以做一个变通的方法,在这里我使用一个类似于附近一个点正确计算的法线的法线,或者我可以忽略任何一个给出零Voronoi区域的点。但我真的很想知道如何解决这些空白区域,这样我就可以使用尽可能多的输入数据。你知道吗
This answer表示Voronoi(points, qhull_options='Qbb Qc Qx')
,在docs中,scipy表示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为什么这样做或如何绕过它,请告诉我您是如何从点云生成高质量网格的
目前没有回答
相关问题 更多 >
编程相关推荐