Цитата:
Сообщение от dimarik
На дереве рекурсия немного не подпадает под определение
|
Я хотел написать гневный комментарий, но мне стало лень =) Ерунда это, короче. И в особенности ерунда применительно к рисованию деревьев по данным. Использование рекурсии подходит как нельзя лучше для этой задачи.
Имеем данные, представленные деревом. Все дерево можно построить из, например, вот таких объектов:
Код AS3:
public class Node
{
// массив детей, которые могут иметь своих детей и т.д.
// может быть пустым
public var children:Vector.<Node>;
// данные, которые мы хотим хранить в узле дерева
// может быть null
public var info:String;
public function Node(info:String = null)
{
this.children = new Vector.<Node>();
this.info = info;
}
}
В коде можем теперь делать вот такие штуки:
Код AS3:
var parent:Node = new Node("I'm a parent!");
var child:Node = new Node("I'm a child!");
parent.children.push(child);
Замечательно, теперь наша структура может стать похожей на то что было у автора поста.
Теперь попробуем рисовать что-то по этим данным. Для начала сделаем класс для отображения одного узла:
Код AS3:
public class NodeView extends Sprite
{
private var _data:Node;
private var _textView:TextField;
public function NodeView(data:Node)
{
super();
_data = data;
this.draw();
}
// тут мы рисуем что-то, что отображает наши данные
// так как в наши данные входит текст, то рисуем текстовое поле
// а раз уж у нас есть еще и дети - сразу создаем отображения детей
// "по образу и подобию" =)
private function draw():void
{
_textView = new TextField();
_textView.text = _data.info;
for each (var childData:Node in _data.children)
{
var childView:NodeView = new NodeView(childData);
// выравниваем детишек друг относительно друга
childView.x = ...;
childView.y = ...;
// и добавляем в список отображения
super.addChild(childView);
}
}
}
На выходе будем иметь экземпляр NodeView, у которого есть ширина и высота. При чем ширина и высота NodeView определяются их размеров текстового поля с информацией и размерами и положением его детей. А размеры детей определяются размерами их детей. И так далее вниз по каждой ветке дерева.