我正在尝试为 Blender 编写一个插件,它可以自动整齐地排列节点树,没有重叠或向左流动的连接。 我可以访问节点列表、它们的位置、它们的尺寸和连接/链接列表。 该图从左到右运行,可以有多个开始和结束节点。一个节点的输出不能连接到它之前的一个节点的输入,或者它自己的输入(没有循环依赖。)
有没有人知道一篇论文或文章着重于编写可以改变这一点的东西:
进入这个?
我最初想出的方法是: 对于没有输入连接的所有节点,将它们排在左侧。 对于连接到这些起始节点的所有节点,将它们放在连接起始节点的右侧。 对每个节点重复此操作直到结束。 如果一个节点与另一个节点重叠,则将其移动,并将节点链向右向下移动。
这对每个独立链都非常有效,但是当一条链的节点连接到另一条链的节点时(例如,连接回主干的分支),它通常会有反向连接:
我想出的这个方法似乎很……粗糙。我已经阅读了一些关于 Spring Force-Directed 布局的内容,但它们似乎更适用于在任何/所有方向上流动的图形,而且我不完全确定我如何在这里手动实现它,因为我'我仅限于单独使用核心数学,没有其他外部库。
这并不是一个常见的问题,但我绝不是第一个尝试解决这个问题的人。 我并不是要确切的代码示例,只是要看一些可以帮助我制定出不错的算法的东西。
最佳答案
A topological sort节点的数量(如果存在)将为您提供正确的节点显示顺序。 如果两个节点不相关但排序相邻,如果您愿意,可以将它们放在相同的 X 坐标上。
一般来说,绘制具有适当间距的树是 NP 完全的 [参见 Drawing Presentable Trees 处的引用资料] , by Bill Mill],绘制图表也并不容易。
关于algorithm - 如何线性排列图形而不重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125202/