MST来自2D三角形阵列,但有一点扭曲

时间:2017-10-23 00:28:11

标签: c++ algorithm design-patterns graph-theory procedural-generation

以下是迄今采取的步骤的说明: Steps Taken

  1. 伪随机矩形生成
  2. "中心节点"插入,矩形分离和最终节点选择
  3. Delaunay triangulation(与之前选择的节点一起显示)
  4. 渲染三角形边
  5. 此时(步骤5),我想使用这些数据形成Minimum Spanning Tree,但是轻微的抓住......

    图中的某个位置(可能位于中心附近,但并非总是如此)将是一个节点,需要与其他唯一节点建立3-5个连接。这使事情变得复杂,因为每个其他节点应该只包含一个连接,并且所使用的数据结构使得很难确定与什么相关联的东西"以可靠的,可遍历的格式。

    因此,给定上述格式的三角形数组,以及用作"根节点"的随机顶点,如何正确遍历网络以创建至少有3个MST的MST连接到我们的"中心节点",但不超过5个连接到它?这可能吗?

2 个答案:

答案 0 :(得分:1)

由于在Delaunay三角剖分中有一个顶点很少有6个以上的边缘,你可以使用强力:只有20 + 15 + 6种方法可以选择3个,4个或5个边缘(分别为6个) ),所以尝试所有这些。对于这样创建的41个小树(最多336个9级)中的每一个小树(根和一些边),运行Kruskal's algorithmPrim's algorithm,从已经“找到”的那棵树开始MST的。 (忽略根的其他边缘,以免进一步增加其度数。)然后选择最好的一个(包括种子树的成本)。

对于一般邻居信息问题,您似乎只需要首先构建标准图形表示。例如,您可以通过扫描所有Edge个对象并将每个端点存储在与另一个相关联的列表中(在map<Vector2<T>,vector<Vector2<T>>>或基于顶点的任何标识符的等效项中)来创建邻接列表

答案 1 :(得分:0)

我采取了一种解决方法......

在算法的第3步之后,我简单地删除连接到“中心节点”的所有边缘,跟踪哪些边缘形成围绕它的“环”(也称为“边缘环”),并在所有边缘上运行MST剩下的边缘。

对于MST,我选择了增强图库。 这样可以很容易地遍历我所拥有的三角形,将其三条边中的每一条都添加到adjacency_list。然后简单地调用任何提升MST算法来处理其余的事情。

最后,我读了以前拍摄的边缘。最短路径是上一步中的任何路径,加上连接到“环”上另一条边的任何读取边的长度最短。

然后我可以添加(或删除)任意数量的先前边缘,以确保从边缘循环到“中心节点”连接3到5个边。

按顺序执行操作还可以让我在步骤3中尽快知道是否有有效边数,因此我们不会浪费运行MST的周期。