Вы можете решить эту проблему рекурсивно.
Без диаграмм (которые очень помогли бы!) здесь идет схема — вам нужно заполнить детали! - одного алгоритма для этого. Алгоритм вбивается прямо в ответ - ждите ошибок.
Первый:
- Ограничивающая рамка прямоугольник, заключающий в себе рисунок (под)дерева.
- Привязка как точка, к которой в направлении соединяются дуги (часть дуги может быть скрыта отрисовкой узлов) для соединения с (под)деревом.
- Якорь будет началом координат ограничивающей рамки, поэтому ограничивающие рамки являются измерениями относительно этой точки.
- Ограничивающая рамка может иметь дочерние элементы — ограничивающие рамки для поддеревьев. Расположение каждого дочернего элемента относительно привязки ящиков.
Теперь:
Рассмотрите возможность сначала нарисовать один узел без дочерних элементов. В зависимости от желаемого размера вы можете определить ограничивающую рамку для этого единственного узла. Вы используете круги, поэтому якорь, начало координат (0,0) ограничивающей рамки находится в центре, а ограничивающая рамка +/- радиус относительно этого. Таким образом, у вас есть якорь ограничивающей рамки (0,0) и его размер относительно этого - скажем, (x минимум, x максимум, y минимум, y максимум) составляет (-радиус, +радиус, -радиус, +радиус). Возможно, вы также захотите сохранить метку узла. Так, например, для узла «L» на вашей диаграмме в целом у вас есть представление (т.е. и объект), содержащее: (0,0), (-радиус, +радиус, -радиус, +радиус) и «L».
Теперь рассмотрите возможность рисования узла с одним дочерним элементом. Рекурсивным вызовом определите ограничивающую рамку для дочернего элемента. Создайте ограничивающую рамку, чтобы заключить дочерний элемент с вашим узлом в центре верхней части этой рамки и дочерней ограничивающей рамкой непосредственно под ним. Таким образом, у вас есть якорь ограничивающей рамки, его размер относительно этого и один дочерний элемент со смещением от якоря. Так, например, для узла «H» выше у вас есть: (0,0), (xmin, xmax, ymin, ymax), «H», 1 дочерний элемент в (xoffset, yoffset), дочерний элемент (ссылка на объект ) (0,0), (-радиус, +радиус, -радиус, +радиус) & "L".
Теперь рассмотрите возможность рисования узла с двумя дочерними элементами и т. д.
Единственный рекурсивный обход от корня вашего дерева, в каждом узле, объединяющий информацию, возвращенную из поддеревьев, создает структуру, описывающую расположение вашего дерева. А теперь нарисуй!
ХТН
person
CRD
schedule
03.12.2013