算法设计 - 查找共享顶点的三角形组的更好方法

时间:2016-05-24 00:12:03

标签: c# algorithm delaunay voronoi

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

enter image description here

我能够通过获取所有三角形的外心来轻松地计算Voronoi图形顶点​​(红线的交点)。

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

enter image description here

所以我的代码看起来像这样(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);
            }
        }
    }

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

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

这只是O(n)扫描。