我正在尝试为Blender编写一个插件,它可以自动排列节点树,没有重叠或连接流向左侧。 我可以访问节点列表,它们的位置,尺寸以及连接/链接列表。 该图从左到右运行,可以有多个开始和结束节点。节点的输出无法连接到它之前的节点的输入,或者它自己的输入(没有循环依赖性。)
有没有人知道一篇专注于编写可以解决这个问题的论文或文章:
进入这个?
我最初提出的方法是: 对于没有输入连接的所有节点,请将它们排在左侧。 对于连接到这些起始节点的所有节点,将它们放在连接起始节点的右侧。 对每个节点重复此操作直到结束。 如果一个节点与另一个节点重叠,则移动它,并将节点链向右移,向下。
这适用于每个隔离链,但是当一个链的节点连接到另一个链的节点(例如,连接回主干的分支)时,它通常会有一个反向连接:
我提出的这种方法似乎很粗糙。我已经阅读了一些关于Spring Force-Directed布局的内容,但它们似乎更适用于任何/所有方向的图形,而且我不完全确定如何在这里手动实现它,因为我m仅限于使用核心数学而没有其他外部库。
这不是一个常见的问题,但我并不是第一个试图解决问题的人。 我并不是要求准确的代码示例,只是为了帮助我制定一个不错的算法。
答案 0 :(得分:4)
topological sort个节点(如果存在)将为您提供正确的节点排序以供显示。 如果两个节点不相关但是相邻排序,则可以根据需要将它们放在相同的X坐标上。
一般来说,绘制具有适当间距的树是NP完全的[参见Bill Drawing Presentable Trees的参考文献],绘图图并不容易。
答案 1 :(得分:1)
我会使用GraphViz:http://www.graphviz.org/
除非你出于学术原因,否则不要重新发明轮子。这种方法应该很容易实现,并且不需要设计复杂的图形布局算法。
答案 2 :(得分:1)
我没有尝试创建完美的系统,而是决定通过自己解决每个问题来强制我的方式,而不是阻止它的原因。这很粗糙,很慢,而且远非理想,但它有效:
当它更完整时我会在GNU下发布它,但是现在这里是它的核心:http://www.pasteall.org/43213/python
编辑: 已发布:http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Nodes/Node_Wrangler