平面图形游戏的算法

时间:2014-08-26 18:02:44

标签: algorithm planar-graph

我正在寻找以下任务的算法:

我们正在玩以下游戏:在我们面前绘制了一个平面图,例如: enter image description here

我们可以看到边缘在3个地方相互交叉。我们将移动顶点而不删除任何边缘,因此边缘不再相互交叉。例如对于给定的图形,我们可以通过首先移动顶点E,在以下两个步骤中完成, enter image description here

然后移动顶点B

enter image description here

这是一个非常简单的例子。给出的平面图可能要复杂得多。

enter image description here

必须转换为

enter image description here

任何人都可以通过反复试验来做到这一点,但在给定任何平面图结构的情况下,需要遵循的一般算法是什么。

欢迎任何提示或解决方案。提前致谢! :)

2 个答案:

答案 0 :(得分:2)

如果解决方案的复杂性无关紧要,则存在线性时间算法以找到每个顶点的坐标,使得绘图是直线平面的。不幸的是,它相当复杂;第一步是使用例如Boyer-Myrvold(On the Cutting Edge:Simplified O(n)Planarity by Edge Addition,2004)找到组合平面嵌入,然后通过Chrobak将这种组合嵌入转换为几何嵌入 - Payne(用于在网格上绘制平面图的线性时间算法,1995)。这些算法在Boost Graph Library中实现。

一种更简单的算法,大部分时间都可用于连接良好的图形,例如样本spectral layout。计算eigenvectors的第二个和第三个Laplacian matrix,并将它们用作X和Y坐标。

答案 1 :(得分:0)

如果您对最低成本感兴趣,那么本论文中描述的算法Planarity Testing By Path Addition将找到可能生成所有可能的平面嵌入的排列(在O(|Edges|)时间和内存中生成包含数据结构的数据结构循环边排序的所有排列,以给出平面嵌入和O(|Edges|)时间和内存,以便为每个单独的排列生成嵌入)。然后,您可以遍历这些排列并找到最低成本。

如果图形总是最大平面,则这是过度的(因为只有一个可能的循环边缘排序),但您可能仍需要考虑许多可能的外面。

[顺便说一下:第一张图可以重新排列成一次移动中的平面嵌入 ​​- 移动(C)到(A)和(E)之间的中点