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

时间:2018-12-31 18:58:21

标签: python scipy voronoi qhull scipy-spatial

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

我要寻找的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会这样做或如何解决它,请让我知道您从点云制作高质量网格所做的工作

0 个答案:

没有答案