|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Vladimir A. Pertzel 2:5020/400 04 Sep 2002 11:48:14 To : Roman Babakov Subject : Re: Вывод некоего дерева -------------------------------------------------------------------------------- "Roman Babakov" <Roman.Babakov@p27.f220.n465.z2.fidonet.org> wrote in message news:1030910234@p27.f220.n465.z2.fidonet.ftn... > HELLo, All! > > Посоветуйте, pls: как лучше вывести (консольно) некое дерево, > состоящее, например, из вершин графа. А то дерево есть, а увидеть 1. Зная координаты начала рисунка, вывести на экран одну вершину и посчитать для нее bounding box не проблема? Вариантов, правда, много: обозначать звездочкой, прямоугольником или точкой, возможно размером в ширину линии; надпись распологать вертикально или горизонтально, внутри прямоугольника или снаружи, справа точки или снизу... 2. Умея рисовать поддеревья и зная для них bounding boxen, нарисовать некую вершину и посчитать для нее bounding box тоже просто: рисуем первого потомка, затем, по очереди, вычисляем общий bounding box для уже нарисованных и рисуем остальных потомков. После чего пририсовываем родителя. Вариантов, правда, много: распологать детей вертикально (а родителя справа или слева) или горизонтально; родителя распологать с краю или в центре; соединять родителя с потомками прямой, дугой или ломаной со звеньями параллельными осям координат. Возможно, придется весь рисунок сдвинуть параллельным переносом, для простоты написания кода, так, чтобы либо одна из вершин bounding box, либо рисуемая вешина совпадала с началом координат (дело вкуса). Вот, собственно и всё. Hарисовав так (рекурсивно) узел, выбранный в качестве вершины, получишь всё дерево. Только определись с выбором, как располагать, а это зависит от глубины дерева и количества потомков у одного узла. Если поддеревья имеют сильно разное количество узлов, можно усложнить алгоритм, и хранить отдельно bounding boxen для всех потомков некоторого уровня, чтобы иметь возможность сдвинуть деревья поближе. Тут опять вариант: сдвигать поддерево, жестко скрепленное, или сдвигать по уровням, начиная с верхнего, но во втором варианте требуется думать, каковы допустимые границы сдвига, чтобы не возникало искажения восприятия. на мой взгляд, (скажем) левый потомок не может быль левее, а правый правее родителя, но это субъективно. bounding box -- это такой прямоугольник, который вмещает в себя рисунок, возможно, с необходимыми полями. --- ifmail v.2.15dev5 * Origin: Sent via Graf's Inn at news://news.relhum.org (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/13592a309b166.html, оценка из 5, голосов 10
|