Как нарисовать график с меньшим количеством пересечений, используя ломаную линию? - PullRequest
2 голосов
/ 07 декабря 2011

Я имею дело с графом с координатами n узлов и m неориентированными ребрами. Как я могу получить лучший визуальный граф (с меньшим количеством пересечений), разрешив использовать некоторую ломаную вместо прямой?

Я знаю, что минимизировать число пересечений - это проблема NP. Поэтому я просто прошу помощи здесь, потому что я думаю, что кто-то может дать мне некоторые ресурсы об этом.

Более того, я думаю, что это нормально, что изменить координаты некоторых узлов (не перемещать их слишком далеко), в общем, проблема в том, как найти более четкий график для наших глаз!

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

Библиотека графов Boost (т. Е. BGL) имеет множество алгоритмов и структур данных для экспериментов, а также двойной интерфейс (разумеется, c ++ или python). Конечно, Boost - не самый простой способ начать. Конечно, Graphviz (который BGL может взаимодействовать) намного проще.

В BGL документах есть много ресурсов, которые вы можете найти полезными: например, по предыдущей ссылке:

Любой чертеж плоскости разделяет плоскость на отдельные области, ограниченные ребрами графа, называемыми гранями. В качестве простого примера, любое вложение треугольника в плоскость разделяет его на две грани: область внутри треугольника и (неограниченную) область вне треугольника. Неограниченная область вне вложения графа называется внешней гранью. Каждое вложение дает одну внешнюю грань и ноль или более внутренних граней. Известный результат, называемый формулой Эйлера, гласит, что для любого плоского графа с n вершинами, e ребрами, f гранями и c связными компонентами

n + f = e + c + 1

Эта формула подразумевает, что у любого плоского графа без петель или параллельных ребер не более 3n - 6 ребер и 2n - 4 граней. Из-за этих границ алгоритмы на плоских графах могут выполняться во времени O (n) или в пространстве O (n) на графе вершин n, даже если им приходится пересекать все ребра или грани графа.

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

В библиотеке графов надстроек плоское вложение является моделью концепции PlanarEmbedding. Тип, который моделирует PlanarEmbedding, может быть передан в тест на плоскостность и заполнен, если входной граф является плоским. Все остальные алгоритмы планарного графа "back end" принимают это заполненное PlanarEmbedding в качестве входных данных. «

0 голосов
/ 16 декабря 2011

Сайт GraphViz - хорошее место для начала изучения визуализации графиков.

...