【问题标题】:Algorithm design - a better way of finding sets of triangles that share a vertex算法设计——找到共享顶点的三角形集的更好方法
【发布时间】:2016-09-21 00:19:54
【问题描述】:

我正在尝试从 Delaunay 三角剖分计算 Voronoi 图,我得到了一组顶点(图形上的红色圆圈)和三角形(图形上的蓝线)形式的三角剖分数据:

只需获取所有三角形的外心,我就可以轻松计算 Voronoi 图的顶点(红线的交点)。

但是,我需要为每个红色多边形导出“单元格”信息。为此,对于每个红色顶点,我需要找到一组共享相同顶点的三角形。所以对于带圆圈的顶点,我需要绿色三角形:

所以我的代码看起来像这样(c#):

    foreach (Vertex3 vertex in DelaunayVertices)
    {
        VoronoiCell cell = new VoronoiCell();
        cell.Vertex = vertex;

        //seach all triangles for the ones that match this.
        foreach (Face3 face in DelaunayTriangles)
        {
            if (face.Vertices.Where(v => v.Equals(vertex)).Any())
            {
                //shares vertices, add it's circumcenter as an edge vertex of the cell
                cell.EdgeVertices.Add(face.Circumcenter);
            }
        }
    }

这当然是非常低效的,因为它正在搜索所有内容。但是,面部或真实性的集合是完全未排序的(我不确定如何对它们进行排序,或者是否有帮助)。只是为了混淆,球体的表面上有 3 维顶点。

我唯一需要为每个三角形找到相邻的顶点或面我有它的邻接,所以对于下面的橙色三角形,我知道三个绿色三角形:

我认为遍历此图可能更有效,但我正在努力想出一种算法方法来生成共享点的集合。

【问题讨论】:

  • 我担心,由于特定领域的性质,存在隐藏的要求/约束​​,这会使您很难找到可以接受的答案。也就是说,我建议您只需维护一个字典,其中每个顶点是一个键,值是使用该顶点的所有三角形的列表。您可以通过枚举三角形来填充字典,将该三角形添加到对应于三角形顶点的三个列表中的每一个中。创建数据结构后,检索给定顶点的三角形是 O(n),其中 n 是找到的三角形的数量。
  • 这听起来像是一个不错的计划,应该尝试类似的东西。我将尝试实现它,看看它的表现如何。

标签: c# algorithm delaunay voronoi


【解决方案1】:

您可以尝试空间填充曲线,即沿希尔伯特曲线对顶点进行排序。您也可以尝试多边形点测试,但这非常困难。您也可以尝试使用蛮力算法制作位图。

【讨论】:

    【解决方案2】:

    如果您愿意存储二级顶点到三角形数据结构,您可以先遍历三角形列表,将每个三角形推入与其三个顶点关联的邻接列表中:

    for (all tria's ti)
        for (all nodes ni in tria ti)
            v2t[ni] <- ti
        end for
    end for
    

    这只是O(n) 扫描。

    【讨论】:

    • 完美运行,非常感谢。我觉得我应该想到这一点。
    • 它的构建不是也需要时间吗?
    • 是的,但它只是循环一次,然后再循环一次,所以 2*O(n),然后与我所做的相比,这比我做的快,我认为是 O(n^2 ) 或者其他的东西。 (循环里面有一个循环)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2010-12-03
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多