Python 为什么scipy.spatial.Voronoi()即使没有重复的输入点也输出零个区域? 为什么有些Voronoi区域是空的?

Python 为什么scipy.spatial.Voronoi()即使没有重复的输入点也输出零个区域? 为什么有些Voronoi区域是空的?,python,scipy,voronoi,qhull,scipy-spatial,Python,Scipy,Voronoi,Qhull,Scipy Spatial,我有一个人类表面的点云,我正试图找到它的Voronoi图。所以我找到了scipy.spatial.Voronoi(),包括一些非常好的。但有时vor.regions包含空区域,文档并没有完全解释它们存在的原因。充其量,它解释了与Delaunay计算的关系“注意,由于与上述Delaunay三角剖分类似的数值精度问题,Voronoi区域可能比输入点少。”但如果是这样,那只是因为qhull使用类似(或完全相同)的方法计算Voronoi用于Delaunay三角剖分的算法会发生这种情况。从数学上讲,Vor

我有一个人类表面的点云,我正试图找到它的Voronoi图。所以我找到了
scipy.spatial.Voronoi()
,包括一些非常好的。但有时
vor.regions
包含空区域,文档并没有完全解释它们存在的原因。充其量,它解释了与Delaunay计算的关系“注意,由于与上述Delaunay三角剖分类似的数值精度问题,Voronoi区域可能比输入点少。”但如果是这样,那只是因为qhull使用类似(或完全相同)的方法计算Voronoi用于Delaunay三角剖分的算法会发生这种情况。从数学上讲,Voronoi区域应该为空的唯一原因是其点是否重复

具体目标: 我希望复制使用Voronoi图计算每个输入点的法向量的结果。所以我可以做一个变通方法,在这里我使用一个类似于附近一点正确计算的法线的法线,或者我可以忽略任何给出零Voronoi区域的点。但我真的很想知道如何解决这些空白区域,这样我就可以使用尽可能多的输入数据

背景和其他研究 建议
Voronoi(点,qhull_options='Qbb Qc Qx')
并在scipy中建议
qhull_options=“QJ Pp”

输入数据:

代码: 感谢任何帮助;如果您不确定qhull为什么会这样做或如何绕过它,请告诉我您是如何从点云创建高质量网格的

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