![alt text](https://farm3.static.flickr.com/2001/2314258583_89e1109527.jpg)
我需要搜索哪些算法来实现这样的效果?
您可以通过建立一个系统来紧急处理,其中每个树节点都尽可能与所有其他节点(除父节点外)保持距离,但与父节点保持尽可能短的距离(必须保持一定的最小距离)。如果对每个节点重复运行该算法直到稳定,您将获得像您描述的那样的排列方式。我相信您可以对其进行许多优化,但我非常确定这将是最简单的方法。尝试预先计算所有布局将非常复杂...
你正在尝试绘制图形的平面表示,这与编程有关。 在这里找到一些流行词和资源 以及在维基百科上
哦,我忘了:您可以使用牛顿法来进行计算并施加力。只需要给所有节点一个排斥势能,就像让它们都成为会互相推开的质子。将边缘赋予牛顿弹簧的属性,施加拉力将它们拼合在一起,然后您就可以开始绘画了。甚至可以用这种方法创建漂亮的动画效果。这也是一种官方的绘图方式,但我不知道它的名称。
如果你想绘制占用空间最少且连接最短的树,那么你需要付出计算代价昂贵的解决方案。在一棵相当大的树上使其实时显示会很困难,更不用说对树进行微小更改可能会导致根本性的平衡变化。
另一种方法是放弃物理模拟,采用迭代构建。我上周做了类似的事情,但我的树可能比你的简单得多。
对于此树形布局,每个节点对象都必须存储一个角度和一个偏移量。这两个数字控制它们在图形表面上的位置。
这是我的基本算法:
1) 递归整个树形数据,找到所有的叶子节点。 2) 在执行此操作时,请确保测量每个分支结构的长度,以便您知道哪个是最长的。 3) 一旦您拥有了所有的叶子节点,请将它们平均分布在同心圆上。您可以使用整个圆,也可以只使用某些角度域的部分。 4) 一旦所有的叶子节点都已解决,您需要再次递归遍历树形结构,从外向内进行。您遇到的每个不是叶子节点的节点都需要进行布局。从这里开始,每个节点的角度都是其所有子节点的平均值,偏移量是图形半径 *(节点深度/最大深度)
我发现这给了我一个非常好的、易于阅读的分布,尽管在屏幕使用方面并不是非常高效。我在这里上传了我的树形显示动画:GIF anim