LINUX.ORG.RU

Простые способы визуализировать


0

0

Подскажите какие-нибудь простые алгоритмы для визуализации деревьев. Деревья небольшие (до 50 узлов). Причем не обязательно (и даже не желательно) выделять корневой узел. То-есть нужен алгоритм, получающий дерево и выдающий координаты, в которых нужно отобразить узлы.

Нужно просто примерно равномерное заполнение поля узлами. Пересечения ребер недопустимо.

Главное - простота, то-есть я не хочу смотреть исходники graphviz-a :)

★★★★

брр, ну что может быть проще. Давай прямо на лету придумаю...

Вот: для каждого узла считаешь общее количество подузлов слева,
умножаешь на шаг сетки (произвольный), это будет координата X.
Уровень вложенности - координата Y. Соединяешь линиями деток с родителями.
Получается аккуратное дерево.

Пример (смотреть со шрифтом monospace):

  Y
  ^
0 |                   o
  |          ---------+---
1 |         o             o
  |    -----+-------     -+-
2 |   o   o     o   o   o   o
  |  ---       ---
3 | o   o     o   o
  |
  +---------------------------> X
    1 2 3 4 5 6 7 8 9 0 1 2 3  

anonymous
()
Ответ на: комментарий от anonymous

Ещё можно сделать абсолютно то же самое, но в полярной системе координат. Получится ближе к равномерному заполнению: корень в центре, детки вокруг него. Сильнее этого изворачиваться, по-моему, не стоит.

anonymous
()
Ответ на: комментарий от anonymous

Такой алгоритм при сильно неравномерном дереве дает очень плохие результаты. Иногда получаются длинные нитки и явно нерациональное использование места.

alexru ★★★★
() автор топика

> Главное - простота, то-есть я не хочу смотреть исходники graphviz-a :)

ЕМНИП graphviz и не особо старается, может и кривое ребро сделать.

А сама по себе задачка интересная -- "эстетичное представление дерева".

Предлагаю:

1. Выработать числовой критерий эстетичности (alexru говорил про лишние длины дуг -- так надо форумулу написать, типа суммы этих длин).

2. Запускать алгоритм его максимизации (видимо, что-то типа динамического программирования покатит).

Если же задача стоит просто деревья рисовать, то предложение анонимуса вполне годится.

www_linux_org_ru ★★★★★
()

> я не хочу смотреть исходники graphviz-a :)

В доке на graphviz приводятся ссылки на статьи по визуализации графов.

tailgunner ★★★★★
()
Ответ на: комментарий от alexru

сильно неравномерное дерево можно сделать примерно вдвое краше, выбрав новый узел в качестве корня для начала построения:

1 2 3 4 5

превращается в:

3 2 4 1 5

anonymous
()
Ответ на: комментарий от anonymous

с форматированием:

1
 2
  3
   4
    5

превращается в:

  3
 2 4
1   5

anonymous
()
Ответ на: комментарий от beastie

> кстати, очень интерессная идея "само"-организации неструктурированных графов: http://local.wasp.uwa.edu.au/~pbourke/modelling_rendering/networkorder/

Действительно здорово, только по вычислениям очень затратно. Я ещё в школе писал похожую симуляцию, отталкивающиеся шарики на ниточках. Прежде чем они занимали относительно устойчивое положение, нужно было выполнить несколько сот шагов. Один "шаг" - это пересчёт сил, скорости и координат для каждого шарика. Для расчёта силы, действующей на каждый шарик, нужно учесть влияние всех остальных шариков, то есть сложность N^2 (эн-квадрат).

anonymous
()

>Простые способы визуализировать (вспоминает) ну, там, трава, грибы...

dentux
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.