Как нарисовать презентабельное дерево с помощью CFTree?

Мне нужно нарисовать презентабельное дерево с помощью CFTree. Вы можете увидеть на картинке

введите здесь описание изображения

Должен соответствовать всем принципам, изложенным в этой ссылке.

Принцип таков:

Принцип 1: Края дерева не должны пересекаться.

Принцип 2: Все узлы на одной глубине должны быть нарисованы на одной горизонтальной линии. Это помогает прояснить структуру дерева.

Принцип 3: Деревья должны быть нарисованы как можно более узко.

Принцип 4: Родитель должен быть в центре своих детей.

Принцип 5: Поддерево должно быть отрисовано одинаково, независимо от того, в какой части дерева оно находится.

Принцип 6: Дочерние узлы родительского узла должны быть равномерно распределены.

Как мне рассчитать положение X, Y каждого узла?


person Ameet Dhas    schedule 03.12.2013    source источник
comment
Ты это нарисовал? Если да, не могли бы вы направить меня   -  person Dee    schedule 18.05.2017


Ответы (2)


Вы можете решить эту проблему рекурсивно.

Без диаграмм (которые очень помогли бы!) здесь идет схема — вам нужно заполнить детали! - одного алгоритма для этого. Алгоритм вбивается прямо в ответ - ждите ошибок.

Первый:

  • Ограничивающая рамка прямоугольник, заключающий в себе рисунок (под)дерева.
  • Привязка как точка, к которой в направлении соединяются дуги (часть дуги может быть скрыта отрисовкой узлов) для соединения с (под)деревом.
  • Якорь будет началом координат ограничивающей рамки, поэтому ограничивающие рамки являются измерениями относительно этой точки.
  • Ограничивающая рамка может иметь дочерние элементы — ограничивающие рамки для поддеревьев. Расположение каждого дочернего элемента относительно привязки ящиков.

Теперь:

Рассмотрите возможность сначала нарисовать один узел без дочерних элементов. В зависимости от желаемого размера вы можете определить ограничивающую рамку для этого единственного узла. Вы используете круги, поэтому якорь, начало координат (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

Я понимаю, что это старая тема, но всем, кто погуглил CFTREE, нашел это изображение и ищет аналогичную диаграмму, я могу порекомендовать GraphViz в качестве решения. Я использовал его, и это легко и мощно. Из ColdFusion или любого другого языка вы можете вызвать его через командную строку, создать образ, использовать этот образ, а затем удалить образ. Причина, по которой я упоминаю это программное обеспечение, заключается в том, что за созданием такой диаграммы стоит целая наука (алготрим). Вместо того, чтобы писать его самостоятельно, просто используйте это бесплатное программное обеспечение.

Чтобы получить данные, упорядоченные по родителю/потомку, в Oracle вы можете использовать оператор CONNECT BY.

Создайте свою строку данных, затем вызовите GraphViz, например,

Затем обратитесь к изображению

И удалите его:

person CFer    schedule 16.01.2015