我即将实现一种计算平面嵌入的算法。
我已经开始通过针对一组图表(rome graphs)运行并将我的结果与另一个实现(yfiles)的结果进行比较来验证我的结果。但是,我只能检查平面/非平面答案是否相等,因为对于给定的平面图,可能存在许多不同的嵌入。
如何验证我计算的嵌入(邻接列表中的排序)是否是正确的平面嵌入?
我已经发现了一些可能导致嵌入错误的情况。对于失败的图形,通常手动绘制嵌入变得困难。我发现给出任何图形的boost docs状态,可以产生图形的平面图,这将证明图形是平面的并且平面度证书易于检查。但我也不确定是否/如何以一种傻瓜式的算法方式从有序的邻接列表中创建这样的绘图。
(顺便说一句,这是我的code)
答案 0 :(得分:2)
我所知道的最简单的方法是计算任意生成树,然后验证其余边在双图中没有循环。如果dnext(e)将头部v的半边e映射到头部v的逆时针顺序的下一个半边缘,并且sym(e)是与e相反的半边缘,则rprev(e)= sym(dnext) (e))是顺时针顺序的下一个半边,右边相同。我在我的一个项目的Algorithm.java中实现了这种方法:http://www.davideisenstat.com/trickle/
或者,您可以使用Euler特征。标记顶点(=置换dnext的周期)和面(=置换rprev的周期)并确定存在多少个连通分量。验证(V - C)+(F - C)= E。