【问题标题】:Graph auto-layout algorithm图形自动布局算法
【发布时间】:2011-06-29 01:03:36
【问题描述】:

为了简化问题,我有一个图,其中包含位于 2D 平面上的节点和边。

我想要做的是单击一个按钮,它会使图形自动布局看起来干净。我的意思是边的最小交叉,节点之间的良好空间,甚至可能代表图形比例(加权边)。

我知道这对于什么是干净的图形完全是主观的,但是有谁知道从算法开始,而不是重新发明*?

谢谢。

【问题讨论】:

    标签: algorithm layout graph nodes edges


    【解决方案1】:

    我建议你看看graphvizdot 程序可以采用图形规范并为您生成网络图像,有点“干净”。我已经链接到“理论”页面,如果您对理论背景感兴趣,它会为您提供一些可能相关的链接。如果您只是想要解决您面临的布局问题,那么库和工具本身就足够成熟了。

    【讨论】:

    • 问题是关于图形布局的算法,而不是应用程序。
    • 这就是为什么我在那个页面上特别提到了理论链接。
    • 答案没有明确提到理论链接。这更像是“如果您对理论感兴趣”。最好参考理论链接和“如果您对应用程序感兴趣”。
    • 很公平。我将 OP 理解为想要解决布局问题(而不是重新实现解决方案),并以此为基础(一个经过良好测试的生产质量“*”,他或她不必重新发明)。
    【解决方案2】:

    您会发现 http://graphdrawing.org/this tutorial,由布朗大学教授 Roberto Tamassia 提供,非常有帮助。

    我很喜欢像 Spring Embedder 这样的 Force-Directed Techniques(教程中的第 66-72 页)。

    您假设任何两个相邻节点之间存在弹簧或其他力,并让自然(模拟)完成工作:)

    【讨论】:

    • 我认为问题是关于算法而不是框架。我不明白为什么不接受这个问题,这是唯一一个关于算法的问题。
    • 可能是因为接受的答案指向 graphviz 文档的“理论”部分,该部分根据要求解决算法?不过,您链接的教程看起来很有用,所以对您获得的 +1 感到满意。
    • @digitig thnx。顺便说一句,我没有抱怨。别人做了!
    • @xhg thnx!我在布朗大学编辑了指向 Roberto Tamassia 页面的链接。
    • 提供的链接已失效“本教程”。请相应更新。
    【解决方案3】:

    最流行的布局实际外观的良好视觉指南:关注link

    【讨论】:

    • 虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    【解决方案4】:

    如果您想要 Java 中的布局,也可以使用 JGraph(我从事该项目)。

    【讨论】:

      【解决方案5】:

      我会说是 Noufal Ibrahim,但您也可以更准确地查看 graphviz 项目的 C API。它包括一个用于构建包含所有节点和边的图形的库 (libgraph.pdf),以及一个用于布局图形的库 (libgvc.pdf)(只需计算每个节点的位置),因此您可以在自己的 UI 中显示它例如。

      【讨论】: