如何使用一些虚线绘制一个较少交叉的图形?

时间:2011-12-07 14:00:24

标签: algorithm graph drawing

我正在处理一个具有n个节点坐标和m个无向边的图形,如何通过允许使用一些虚线而不是直线来获得更好的可视图(具有更少的交叉)?

我知道最小化交叉数是一个NP问题。所以我只是请求一些帮助,因为我认为有人可能会给我一些资源。

更重要的是,我认为改变一些节点的坐标(不要将它们移动太远)是可以的,总而言之,这就是如何为我们的眼睛找到更清晰的图形的问题!

2 个答案:

答案 0 :(得分:0)

GraphViz website是开始学习图形可视化的好地方。

答案 1 :(得分:0)

Boost graph library(即BGL)有大量算法和数据结构可供试验,还有双接口(当然是c ++或python)。当然,Boost不是最简单的开始方式。当然,Graphviz(BGL可以接口)更简单。

BGL docs中,您可以找到许多有用的资源:例如,来自上一个链接:

  

任何平面绘图都将平面分成不同的区域,这些区域由称为面的图形边界限定。举一个简单的例子,任何在平面中嵌入三角形都会将其分成两个面:三角形内的区域和三角形外的(无界)区域。图形嵌入之外的无界区域称为外表面。每次嵌入都会产生一个外面和零个或多个内面。一个名为欧拉公式的着名结果表明,对于任何具有n个顶点,e边,f面和c个连通分量的平面图,

     

n + f = e + c + 1

     

这个公式暗示任何没有自环或平行边的平面图最多有3n-6个边和2n-4个面。由于这些边界,平面图上的算法可以在n顶点图上的时间O(n)或空间O(n)上运行,即使它们必须遍历图的所有边或面。

     

将实际平面度测试与接受平面图作为输入的算法分开的便捷方法是通过称为平面嵌入的中间结构。平面嵌入不是指定平面中顶点和边缘的绝对位置作为平面绘图,而是指定它们相对于彼此的位置。平面嵌入由图中每个顶点的序列组成,该序列按照它们围绕该顶点绘制的顺序入射到该顶点上的所有边。此序列定义的顺序可以表示通过每个顶点的邻居的顺时针或逆时针迭代,但方向必须在整个嵌入中保持一致。

     

在Boost Graph Library中,平面嵌入是PlanarEmbedding概念的模型。如果输入图形是平面的,则可以将PlanarEmbedding模型的类型传递到平面度测试并填充。所有其他“后端”平面图算法都接受此填充的PlanarEmbedding作为输入。 “