【问题标题】:Algorithm for efficiently drawing trees?有效绘制树木的算法?
【发布时间】:2012-07-20 23:53:57
【问题描述】:

我需要在 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

你们中有人曾经画过这样的树吗?如果你有,我相信你已经遇到了我遇到的许多障碍。有小费吗?到目前为止,我已经花了一整天的时间。

【问题讨论】:

  • 你想做什么?不应该在microsoft visio之类的里面做吗??
  • @DrStrangeLove 不,我正在编写交互式可视化。

标签: algorithm tree drawing


【解决方案1】:

画树有很多好的算法,每一种都展示了树的一些不同属性。如果你想炫耀一个层次,有this code for WPF that draws hierarchies。有关如何绘制图形和树的更一般性讨论,请考虑查看 these lecture slides 详细介绍许多此类算法。还有these excellent slides覆盖类似的材料。

希望这会有所帮助!

【讨论】:

  • 这绝对是完美的!正是我需要的。它使用 Reingold-Tilford 算法。
  • @user1002358 感谢您的评论。我无法从此处列出的答案中理解算法,但是谷歌搜索“Reingold-Tilford 算法”将我引向this question,我发现它更有用。我还总结了编码算法here的步骤,以防其他人正在寻找简单的解释
【解决方案2】:

您可以使用迭代方法。使用类似于您上面使用的第一个示例的方式布置树。然后将节点或子树彼此靠近,同时确保没有违反约束(例如:节点不能重叠,子节点必须在父节点之下)。

优点:

  • 简单的算法。
  • 获得足够好的解决方案。
  • 可以连续应用于不断变化的树。
  • 可以做得很酷。

缺点:

  • 可能需要多次迭代才能看起来不错。
  • 可能找不到最优解(陷入局部最大值)

【讨论】:

  • 你可以在一次迭代中做这样的事情。
  • 同意,但如果单遍算法在计算上对于大量节点不可行,则迭代优化方法有时会很有用。
猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2020-02-07
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多