从连接节点列表中绘制图形

时间:2012-10-24 18:15:05

标签: algorithm graph coordinates nodes edges

在一个系统中,我有一个像普通图一样连接的节点列表。我们知道整个系统及其所有连接,我们也有一个起点。我的所有边缘都有方向。

现在我想自动绘制所有这些节点和边。问题不是实际绘图,而是计算(x,y)坐标。所以基本上我想绘制整个图表,看起来不错。

我的数据结构类似于:

class node:
string text
List<edge> connections

这个问题必定有一些众所周知的算法吗?我找不到任何东西,但我可能使用了错误的关键字。

我的想法:

一种方法是将我们的startnode定位在(0,0),然后得到一些常量,即“距离”。然后,对于每个邻居,它将向y位置添加距离,并且对于作为邻居的每个节点,设置x =距离* n。

但这确实会带来很多问题 - 所以这绝对不是最佳选择。

2 个答案:

答案 0 :(得分:10)

到目前为止,最常见的方法是使用force-directed layout而不是确定性的方法。要点是你让每个节点相互排斥(反重力)并让任何连接的节点对彼此吸引。经过几次物理模拟迭代后,您可以获得合理的布局。

您可以使用许多布局算法,结果大不相同。 GraphViz fdp(Fruchterman & Reingold '91)和neato(Kamada & Kawai '89)算法有效,但相当陈旧,有更好的选择。 Fruchterman & Reingold '91中的NetworkX算法也可用于Prefuse

ForceDirectedLayout Java class提供的Hachul & Jünger '05速度非常快。 Hachul & Jünger '06详细介绍了FM ^ 3算法,该算法在实践中看起来效果很好(Tulip),并且在NodeXL的C ++中可用。

还有大量其他开源工具可视化图形,例如 Gephi(C#),一个很棒的入门工具,将网络分析集成到Excel 2007/2010中(免责声明:我是它的顾问)。其他令人敬畏的工具包括Cytoscape(Java)和Pajek(Java),而UCINetyEdTom Sawyer和{{3}}是一些专有的替代方案

答案 1 :(得分:2)

一般来说,这是一个棘手的问题,特别是如果你想开始处理边缘路由并使事情变得漂亮。您可以查看http://www.graphviz.org/并使用命令行工具,或使用graphviz库进行布局,并在应用程序中获取x,y坐标。