【问题标题】:Getting 3D Voronoi Cells from Qhull output从 Qhull 输出中获取 3D Voronoi 细胞
【发布时间】:2012-12-18 23:13:18
【问题描述】:

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

7 0 1 1 0 4 5 3

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

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

【问题讨论】:

    标签: computational-geometry voronoi qhull


    【解决方案1】:

    山脊的索引似乎不是循环顺序。因此,重建多边形面可能是不可能的。

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

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

    $ rbox 30 D3 | qvoronoi QV5 p | qconvex G
    

    【讨论】:

    • 我一直在对此进行试验,绘制连接“Fv”输出中相邻顶点的所有线(忽略任何端点在无穷远处的线)。所有绘制的线仅在顶点处彼此相交,因此看起来脊索引可能是圆形顺序。我不确定这是否适用于所有情况或仅适用于我尝试过的少数情况(每个输入点少于 20 个)。
    • @user1911373 请注意,Voronoi 顶点索引 0 处于无穷大。因此,请尝试仅绘制那些有界的单元格。顶点可能是有序的,尽管文档并不清楚。如果是,请随时编辑我的答案。
    【解决方案2】:

    试试凸包

    因为 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)
      ...
      ...
      ...
    

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 2015-03-31
      相关资源
      最近更新 更多