树结构的圆形表示

时间:2009-07-29 21:42:56

标签: algorithm

我在树形结构中有一些数据,我希望以图形方式表示它们,根节点位于舞台中间,他的孩子绕着他围成一圈,等等每个孩子,他们的父母。 我不想重叠节点,所以问题是如何以最佳方式安排空间。 更少或更像alt text(通过谷歌找到)

我需要搜索什么样的算法来实现这样的事情?

4 个答案:

答案 0 :(得分:2)

您可以通过设置一个系统来以紧急方式执行此操作,其中每个树节点尽可能地与所有其他节点(父节点除外)保持尽可能多的距离,但距离父节点的距离尽可能短(向下)至少必须保持的最小距离)。如果你反复为每个节点运行该算法,直到它稳定下来,你将有一个像你描述的那样的安排。我确信你可以做很多优化,但我很确定这将是最简单的方法。尝试预先计算所有布局会非常复杂......

答案 1 :(得分:2)

如果您不关心 如何完成,只是您可视化数据,那么请查看graphvizradial layout。虽然示例看起来并不完全符合您的要求,但它是您需要的布局。它还会为你提供一些关于它如何用大量研究论文完成的想法。祝你好运!

您还可以看到将this paper扩展为循环结构是多么容易。

答案 2 :(得分:1)

您正在尝试绘制图形的平面表示。 Find some buzzwords and perhaps a resource here And in wikipedia

啊,我忘记了:你可以用力量以牛顿的方式做到这一点。 简单地给所有节点一个排斥潜力,就像让所有节点相互推开一样。赋予边缘牛顿弹簧的特性,施加将它们拉在一起的力量,你们都已经固定好了。 甚至可以通过这种方式创建漂亮的动画。 这也是图形绘制的官方方式,但我不知道这个名字。

答案 3 :(得分:1)

如果你想用最少的浪费空间和短连接绘制树,那么你就需要一个计算成本高昂的解决方案。很难让它在一棵体积适中的树上实时,更不用说对树进行小的改动可能会导致完全不同的平衡。

另一种方法是放弃物理模拟,然后迭代地构建它。上周我做了类似的事情,但我的树木可能比你的树木少得多。

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

这是我的基本算法:

1)递归整个树数据并找到所有Leaf节点。 2)当你这样做时,一定要测量每个分支结构的长度,这样你就知道哪个是最长的。 3)一旦你拥有了所有的叶子节点,就可以在同心圆上均匀分布它们。您可以使用整个圆,也可以只使用角度域的某些部分。 4)一旦所有Leaf节点都被解决了,你就会再次在树上进行递归,从外面进入。你遇到的每个节点都不是叶子节点需要布局。本质上,此处的每个节点都有一个角度,它是所有子节点的平均值,偏移量是graph_radius *(depth_of_node / maximum_depth)

我发现这给了我一个非常体面和人性化的可读分布,尽管在屏幕使用方面不是很有效。我在这里上传了我的树形显示动画:GIF anim