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

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

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

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

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

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

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

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

А что-то вроде этого будет лучше, так как дерево очень большое и пространство очень limited:

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

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

2 ответов


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

надеюсь, что это помогает!


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

плюсы:

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

плюсы:

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