Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在不重叠的情况下线性排列图形?_Algorithm_Graph_Nodes_Blender - Fatal编程技术网

Algorithm 如何在不重叠的情况下线性排列图形?

Algorithm 如何在不重叠的情况下线性排列图形?,algorithm,graph,nodes,blender,Algorithm,Graph,Nodes,Blender,我正在尝试为Blender编写一个插件,它可以自动整齐地排列一个节点树,没有重叠或向左流动的连接。 我可以访问节点列表、节点位置、节点尺寸以及连接/链接列表。 该图从左到右运行,可以包含多个开始节点和结束节点。节点的输出不能连接到它前面的节点的输入,或者它自己的输入(没有循环依赖项) 是否有人知道有一篇论文或文章关注于编码一些可以扭转这种局面的东西: 这件事? 我最初想到的方法是: 对于没有输入连接的所有节点,请在左侧将其对齐。 对于连接到这些起始节点的所有节点,将它们放置在连接起始节点的右

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

是否有人知道有一篇论文或文章关注于编码一些可以扭转这种局面的东西:

这件事?

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

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

我想出的这个方法似乎非常。。。原油我读过一些关于Spring Force-Directed布局的书,但它们似乎更适合于任何/所有方向的图形,而且我不完全确定如何在这里手动实现,因为我仅限于使用核心数学,没有其他外部库

这并不是一个常见的问题,但我远不是第一个试图解决这个问题的人。 我并没有要求提供确切的代码示例,只是想看一些东西来帮助我制定一个合理的算法。

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


一般来说,用适当的间距绘制树木是NP完全的[参见参考资料,由Bill Mill提供],绘制图形并不容易。

我将利用GraphViz实现这一点:

  • 将你的搅拌机图读入内存
  • 以GraphViz图形文件格式写出相同的图形
  • 运行一个GraphViz可执行文件(我建议)
  • 读取等效图,但使用GraphViz创建的节点位置
  • 根据GraphViz结果修改位置,编写搅拌机图

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

    我没有尝试创建一个完美的系统,而是决定通过自己解决每个问题,而不是阻止问题的起因,来强制创建一个整洁的图形。它很粗糙,速度很慢,离理想状态还很远,但它确实有效:

    当它更完整时,我将在GNU下发布它,但现在它的核心是:

    编辑:
    发布:

    因为它会被其他人使用,所以我不能依赖任何外部软件或库。我确实看了GraphViz理论的东西,这确实给了我一些启发,尽管我从来没有真正使用过它。