树形结构的循环表示法

3
我有一些树形结构的数据,我想以图形方式表示它们,根节点位于舞台中央,其子节点在他周围的圆圈内分散排列,每个子节点都是如此,绕着他们的父节点。我不想要重叠的节点,所以问题是如何以最优的方式安排空间。类似于 alt text(通过谷歌找到)。
我需要搜索哪些算法来实现这样的效果?
4个回答

2

您可以通过建立一个系统来紧急处理,其中每个树节点都尽可能与所有其他节点(除父节点外)保持距离,但与父节点保持尽可能短的距离(必须保持一定的最小距离)。如果对每个节点重复运行该算法直到稳定,您将获得像您描述的那样的排列方式。我相信您可以对其进行许多优化,但我非常确定这将是最简单的方法。尝试预先计算所有布局将非常复杂...


2
如果您不关心具体的实现方法,只是想要可视化数据,那么可以看看 graphviz径向布局。虽然示例不完全符合您的需求,但它是您所需要的布局。其中还有很多研究论文,可能会给您一些启发。祝好运!
您也可以看看如何将 这篇论文 扩展为圆形结构,非常容易。

1
yEd拥有他所需要的精确布局(http://www.yworks.com/en/products_yed_about.html) - sourcenouveau

1

你正在尝试绘制图形的平面表示,这与编程有关。 在这里找到一些流行词和资源 以及在维基百科上

哦,我忘了:您可以使用牛顿法来进行计算并施加力。只需要给所有节点一个排斥势能,就像让它们都成为会互相推开的质子。将边缘赋予牛顿弹簧的属性,施加拉力将它们拼合在一起,然后您就可以开始绘画了。甚至可以用这种方法创建漂亮的动画效果。这也是一种官方的绘图方式,但我不知道它的名称。


1

如果你想绘制占用空间最少且连接最短的树,那么你需要付出计算代价昂贵的解决方案。在一棵相当大的树上使其实时显示会很困难,更不用说对树进行微小更改可能会导致根本性的平衡变化。

另一种方法是放弃物理模拟,采用迭代构建。我上周做了类似的事情,但我的树可能比你的简单得多。

对于此树形布局,每个节点对象都必须存储一个角度和一个偏移量。这两个数字控制它们在图形表面上的位置。

这是我的基本算法:

1) 递归整个树形数据,找到所有的叶子节点。 2) 在执行此操作时,请确保测量每个分支结构的长度,以便您知道哪个是最长的。 3) 一旦您拥有了所有的叶子节点,请将它们平均分布在同心圆上。您可以使用整个圆,也可以只使用某些角度域的部分。 4) 一旦所有的叶子节点都已解决,您需要再次递归遍历树形结构,从外向内进行。您遇到的每个不是叶子节点的节点都需要进行布局。从这里开始,每个节点的角度都是其所有子节点的平均值,偏移量是图形半径 *(节点深度/最大深度)

我发现这给了我一个非常好的、易于阅读的分布,尽管在屏幕使用方面并不是非常高效。我在这里上传了我的树形显示动画:GIF anim


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接