绘制图形结构的算法?

3
我有一个有向图G=(V,E),因为它目前非常混乱,所以我想重新绘制它。这是一个流程图,由于|V|>1000且每个V中的v都有多于1个出边,因此很难通过肉眼追踪。例如,左下角的节点与右上角的节点相连。如果这两个节点放在一起会更好。有太多的边缘,追踪每一个边缘是一种痛苦。
我可以访问并更改所有顶点的(x,y)坐标。我希望通过保持当前结构来重新绘制G,以更加友好的方式呈现。我认为最小化交叉边数可能是一个开始的方法。
是否有算法可以帮助我重新绘制这个图形?
我的问题是,如何为V中的每个v分配(x,y)坐标,以使其更好地组织和更易于跟踪和阅读?我应该如何正式表达这些要求?如果这是NP问题,我应该选择启发式算法吗? 这里是一个有点有组织的图形示例, 这里是一些混乱的东西(虽然比我处理的东西小得多)。
非常感谢任何帮助。谢谢。
编辑:我仍在寻找简明扼要的答案。我已经研究了平面直线和正交绘图方法,但我得到的是冗长的研究论文。我正在寻找的是实现、伪代码或至少让我开始的东西。
编辑2:我不是试图显示图形。算法的输入应该是由V和E组成的图G,输出应该是对于每个vi的{(xi,yi)}。

不是作业,只是想自动化和简化事情... - Murat Derya Özen
2个回答

4

您需要查看graphviz.org;这是一个难题,已经有很多研究,重新实现并不是正确的方法。

可能您需要获取Java来编写数据文件,然后使用像“dot”这样的工具读取并用于图形布局。


谢谢Tom的回答。你能具体指出我应该查看Graphviz的哪个部分吗? - Murat Derya Özen
Graphviz旨在为您绘制图形。汤姆建议您使用graphviz绘制图形,而不是编写自己的代码。dot语言非常简单,生成dot文件的代码不应该花费太长时间。 - Richard

0

那个混乱的图形似乎是使用样条线绘制的,请尝试使用平面直线算法。确实,这是一个非常困难的问题,我经常使用GraphViz作为我的后端图形绘制工具,您可以使用-Gsplines=line选项生成所需的图形。


边缘是直线还是曲线并不重要。我更关心节点在二维平面上的位置,以便较少的边相交并且边的长度更短。 - Murat Derya Özen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接