我正在尝试从Delaunay三角剖分计算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);
}
}
}
当然,这样做非常低效,因为它在搜索所有内容。但是,面或变化的集合完全未排序(我不确定如何对其进行排序,或者是否有帮助)。为了混淆事情,球体表面有三维顶点。
我唯一需要找到每个三角形相邻的顶点或面的东西就是它的邻接性,因此对于下面的橙色三角形,我知道三个绿色三角形:
我在思考遍历这个图可能更有效,但我很难想出一个算法的方法来产生共享点的集合。