algorithm - 如何线性排列图形而不重叠?

标签 algorithm graph nodes blender

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

有没有人知道一篇论文或文章着重于编写可以改变这一点的东西: Messy nodes

进入这个? Neat nodes

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

这对每个独立链都非常有效,但是当一条链的节点连接到另一条链的节点时(例如,连接回主干的分支),它通常会有反向连接: Backward connection

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

这并不是一个常见的问题,但我绝不是第一个尝试解决这个问题的人。 我并不是要确切的代码示例,只是要看一些可以帮助我制定出不错的算法的东西。

最佳答案

A topological sort节点的数量(如果存在)将为您提供正确的节点显示顺序。 如果两个节点不相关但排序相邻,如果您愿意,可以将它们放在相同的 X 坐标上。

一般来说,绘制具有适当间距的树是 NP 完全的 [参见 Drawing Presentable Trees 处的引用资料] , by Bill Mill],绘制图表也并不容易。

关于algorithm - 如何线性排列图形而不重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125202/

相关文章:

algorithm - 测量信号的峰值检测

data-structures - 如何在没有头指针的情况下找到单链表的前一个节点

node.js - Express 和 Hihttp2 不适合我

javascript - 提取字符串的中间部分 - JavaScript

c++ - 数组旋转和删除

google-maps - 如何在没有预定义起点或终点的情况下找到图中所有节点之间的最短路径?

graph - AI 中的边缘搜索与 A* 算法

xml - 使用Powershell的属性的XML元素名称

algorithm - 如何用卷积解决精确模式匹配

graph - ArangoDB,如何显示图表?