为什么科学空间沃罗诺()即使没有重复的输入点也输出零区域?

2024-05-23 16:00:40 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么有些沃罗诺区域是空的?

我有一个人类表面的点云,我正试图找到它的沃罗诺图。所以我找到了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为什么这样做或如何绕过它,请告诉我您是如何从点云生成高质量网格的


Tags: compt区域npscipyspatialvoronoiinner