如何线性排列图形,没有重叠?

时间:2013-06-15 15:31:37

标签: algorithm graph nodes blender

我正在尝试为Blender编写一个插件,它可以自动排列节点树,没有重叠或连接流向左侧。 我可以访问节点列表,它们的位置,尺寸以及连接/链接列表。 该图从左到右运行,可以有多个开始和结束节点。节点的输出无法连接到它之前的节点的输入,或者它自己的输入(没有循环依赖性。)

有没有人知道一篇专注于编写可以解决这个问题的论文或文章: Messy nodes

进入这个? Neat nodes

我最初提出的方法是: 对于没有输入连接的所有节点,请将它们排在左侧。 对于连接到这些起始节点的所有节点,将它们放在连接起始节点的右侧。 对每个节点重复此操作直到结束。 如果一个节点与另一个节点重叠,则移动它,并将节点链向右移,向下。

这适用于每个隔离链,但是当一个链的节点连接到另一个链的节点(例如,连接回主干的分支)时,它通常会有一个反向连接: Backward connection

我提出的这种方法似乎很粗糙。我已经阅读了一些关于Spring Force-Directed布局的内容,但它们似乎更适用于任何/所有方向的图形,而且我不完全确定如何在这里手动实现它,因为我m仅限于使用核心数学而没有其他外部库。

这不是一个常见的问题,但我并不是第一个试图解决问题的人。 我并不是要求准确的代码示例,只是为了帮助我制定一个不错的算法。

3 个答案:

答案 0 :(得分:4)

topological sort个节点(如果存在)将为您提供正确的节点排序以供显示。 如果两个节点不相关但是相邻排序,则可以根据需要将它们放在相同的X坐标上。

一般来说,绘制具有适当间距的树是NP完全的[参见Bill Drawing Presentable Trees的参考文献],绘图图并不容易。

答案 1 :(得分:1)

我会使用GraphViz:http://www.graphviz.org/

  1. 将您的Blender图表读入内存
  2. 以GraphViz图形文件格式写出相同的图形
  3. 运行GraphViz可执行文件之一(我建议dot (link)
  4. 阅读等效图,但由GraphViz
  5. 创建节点位置
  6. 根据GraphViz结果
  7. 编写您的Blender图,并修改位置

    除非你出于学术原因,否则不要重新发明轮子。这种方法应该很容易实现,并且不需要设计复杂的图形布局算法。

答案 2 :(得分:1)

我没有尝试创建完美的系统,而是决定通过自己解决每个问题来强制我的方式,而不是阻止它的原因。这很粗糙,很慢,而且远非理想,但它有效: Example 1 Example 2 Example 3

当它更完整时我会在GNU下发布它,但是现在这里是它的核心:http://www.pasteall.org/43213/python

编辑: 已发布:http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Nodes/Node_Wrangler