有效绘制树木的算法?

时间:2011-11-27 22:11:13

标签: algorithm tree drawing

我需要在C#中绘制一个公司结构树(类似于家谱)。所有辅助代码都在那里。它是有色的,互动的和花哨的。唯一的麻烦是算法实际上决定了每个节点放在哪里给我带来了很多的悲伤。

目前,盒子大小为100x50,我有一个名为StaffNode的班级,代表特定x,y坐标的工作人员。

算法只需要用适当的x和y创建List<StaffNode>

这非常棘手。

基本上,算法是沿着公司结构递归的,所以左 - >向右,然后沿着树向上和向下。显然,如果两个节点相互叠加,那就太糟糕了。

我可以想到一些算法可能产生这样的东西:

          *
    o         O
o o o o o     O
o         O O O O O
                O

虽然这样的事情会更好,因为树很大而且空间非常有限:

       *
    o     O
o o o o o O
o     O O O O O
            O
你以前有没有人像这样画一棵树?如果你有,我相信你已经遇到了很多障碍。有小费吗?到目前为止,我已经花了一整天时间。

2 个答案:

答案 0 :(得分:15)

有许多用于绘制树木的好算法,每种算法都展示了树木的一些不同属性。如果要展示层次结构,可以this code for WPF that draws hierarchies。有关如何绘制图形和树的更一般性讨论,请考虑详细介绍许多此类算法的these lecture slides。还有these excellent slides涵盖了类似的材料。

希望这有帮助!

答案 1 :(得分:1)

您可以使用迭代方法。使用上面使用的第一个示例来布置树。然后移动节点或子树彼此更接近,同时确保没有违反约束(例如:节点不能重叠,子节点必须低于父节点)。

优点:

  • 简单的算法。
  • 获得足够好的解决方案。
  • 可以连续应用于更改树。
  • 可以看起来很酷。

缺点:

  • 可能需要多次迭代才能看起来很好。
  • 可能找不到最佳解决方案(陷入局部最大值)