从Qhull输出获取3D Voronoi单元

时间:2012-12-18 23:13:18

标签: computational-geometry voronoi qhull

我的目标是从Qhull的qvoronoi子程序的输出中获取单独的3D Voronoi单元格(包括顶点和边缘)。但是,我无法理解voronoi脊(输出'Fv')。输出中的示例行是:

7 0 1 1 0 4 5 3

第一个数字是行中顶点的数量,接下来的两个是由脊分隔的顶点的索引,其余的数字是脊上的顶点索引。我天真地尝试连接相邻的顶点(即4->55->33->1等),它似乎有效,但我不确定这是否正确。这些点如何相互连接?

此外,从qvoronoi输出(选项'FN'),我可以得到每个区域的顶点,但没有关于顶点之间连接的信息。我想知道这些信息在哪里。它是在脊输出中,还是在不同的qvoronoi输出选项中?

2 个答案:

答案 0 :(得分:2)

脊的指数似乎不是循环次序。因此,重建多边形面可能是不可能的。

另一种方法是将每个单元格的gvoronoi的输出传递给qconvex以构造凸包。这不能很好地扩展,但如果您想要可视化或分析的单元格很少,则可能没问题。

例如,要获得30个输入站点的输入站点5的Voronoi单元格:

$ rbox 30 D3 | qvoronoi QV5 p | qconvex G

答案 1 :(得分:0)

尝试凸包

由于Voronoi仅保证凸多面体,因此存在一种通过找到凸壳(在我的情况下为scipy.spatial.ConvexHull()中)来发现此错误的方法。环绕Voronoi地区的最小凸包将满足您的需求,scipy.spatial甚至免费为您提供其他东西

hull=scipy.spatial.ConvexHull(vertices)
volume=hull.volume
triangle_mesh_hull=vertices[hull.simplices] # shape is (n,3,3)
上面的非常短而优美的行的

信用归于Jaime。如果要在此之后对网格的每个三角形部分进行操作,则可以像这样访问它:

for triangle in triangle_mesh_hull:
  do_stuff_to(triangle)
  ...
  ...
  ...
  do_more_stuff_with(triangle)
  ...
  ...
  ...