Алгоритм эффективного рисования деревьев?

Мне нужно нарисовать дерево корпоративной структуры (похожее на семейное дерево) на С#. Все вспомогательные коды есть. Он цветной, интерактивный и причудливый. Единственная проблема - алгоритм, который фактически решает, куда помещать каждый node, дает мне много горя.

На данный момент размеры ящиков равны 100x50, и у меня есть класс под названием StaffNode, который представляет сотрудника в определенной координате x, y.

Алгоритм просто должен создать List<StaffNode> с соответствующими x и y.

Это невероятно сложно.

В основном алгоритм рекурсивный по корпоративной структуре, поэтому left- > right, затем top- > down вдоль дерева. Очевидно, что это плохо, если два узла находятся друг над другом.

Я могу придумать несколько алгоритмов, которые могут вызвать что-то вроде этого:

          *
    o         O
o o o o o     O
o         O O O O O
                O

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

       *
    o     O
o o o o o O
o     O O O O O
            O

У кого-нибудь из вас раньше было рисовать дерево? Если у вас есть, я уверен, что вы столкнулись со многими препятствиями, которые у меня есть. Какие-нибудь советы? До сих пор я провел целый день.

Ответ 1

Существует много хороших алгоритмов для рисования деревьев, каждый из которых демонстрирует некоторое свойство деревьев. Если вы хотите показать иерархию, есть этот код для WPF, который рисует иерархии. Для более общего обсуждения того, как рисовать графики и деревья, рассматривая эти слайды лекций, подробно излагая многие такие алгоритмы. Там также эти превосходные слайды, покрывающие аналогичный материал.

Надеюсь, это поможет!

Ответ 2

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

Плюсы:

  • Простой алгоритм.
  • Получает достаточно хорошее решение.
  • Может применяться непрерывно к изменяющемуся дереву.
  • Можно сделать так, чтобы выглядеть круто.

Минусы:

  • Может потребоваться много итераций, чтобы хорошо выглядеть.
  • Невозможно найти оптимальное решение (попадает в локальный максимум)