如何使用CFTree绘制可呈现的树?

时间:2013-12-03 08:06:57

标签: ios objective-c tree core-foundation

我必须使用CFTree绘制一个可呈现的树。你可以在图片中看到

enter image description here

应该满足this link中所述的所有原则。

原则是:

原则1:树的边缘不应相互交叉。

原则2:同一深度的所有节点都应绘制在同一水平线上。这有助于明确树的结构。

原则3:树木应尽可能地绘制。

原则4:父母应该以孩子为中心。

原则5:无论树在何处,都应该绘制相同的子树。

原则6:父节点的子节点应均匀分布。

我应该如何计算每个节点的X,Y位置?

2 个答案:

答案 0 :(得分:0)

您可以递归地解决此问题。

没有图表(这会有很多帮助!)这里有一个大纲 - 你需要填写详细信息! - 一种算法。该算法直接输入答案 - 期望错误。

首先:

  • 包围框包围(子)树图形的矩形。
  • 锚定作为连接弧将朝向绘制的点(弧的一部分可能被节点绘制遮挡)以连接到(子)树。
  • 锚点将是边界框的坐标原点 - 因此边界框是相对于此点的测量值。
  • 边界框可能包含 children - 子树的边界框。每个孩子的位置都与箱子锚相关。

现在:

首先考虑绘制一个没有子节点的节点。根据您所需的大小,您可以确定此单个节点的边界框。您正在使用圆,因此锚点,边界框的(0,0)坐标原点位于中心,边界框为+/-相对于该边界的半径。所以你有边界框的锚点(0,0),它的大小相对于那个 - 比如说(x最小,x最大,y最小,最大y)是(-radius,+ radius,-radius,+ radius)。您可能还希望存储节点的标签。因此,例如对于图中的“L”节点,总共有一个表示(即对象)包含:(0,0),( - 半径,+半径, - 半径,+半径)& “L”。

现在考虑使用单个子节点绘制节点。通过递归调用确定子项的边界框。构造一个边界框,将您的节点封闭在此框的顶部中心,并将子边界框直接放在该框的下方。所以你有一个边界框的锚点,它的大小相对于它,以及一个偏离锚点的子节点。因此,例如对于上面的“H”节点,你有:(0,0),(xmin,xmax,ymin,ymax),“H”,1个孩子在(xoffset,yoffset),child是(对象的引用) )(0,0),( - 半径,+半径, - 半径,+半径)& “L”。

现在考虑绘制一个包含2个孩子等的节点

从树的根处进行单个递归遍历,在每个节点组合从子树返回的信息,生成描述树的布局的结构。现在画吧!

HTH

答案 1 :(得分:0)

我意识到这是一个旧线程,但对于其他任何使用CFTREE搜索并发现此图像并正在寻找类似图表的人,我可以推荐GraphViz作为解决方案。我已经习惯了它,它很简单而且功能强大。从ColdFusion或任何其他语言,您可以通过命令行调用它,让它创建一个图像,使用该图像,然后删除图像。我提到这个软件的原因是如何构建这样的图表背后有一个完整的科学(algothrym)。不要自己写,而是使用这个免费软件。

要获取父/子所订购的数据,在Oracle中您可以使用CONNECT BY语句。

构建您的数据字符串然后调用GraphViz - 例如,

然后参考图像

删除它: