Алгоритм компоновки, который понимает компас, вырос

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

Например, у меня есть узлы: House-1, House-2, House-3 с краями [House-1, north-of, House-2], [House-2, east-of, House-3].

Я ищу алгоритм компоновки, который может быть сделан для понимания розыска компаса (возможно, как подсказки?)

Я прошел через JUNG, JGraph, GraphViz, и никто, кажется, не делает то, что я хочу, но я, возможно, что-то пропустил.

Любые предложения?

Ответы

Ответ 1

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

Hyungmin Lee, Sooyun Lee, Namwook Kim и Jinwook Seo. 2012. JigsawMap: соединение прошлого с будущим путем сопоставления исторических текстовых кадастров. В трудах Ежегодной конференции ACM 2012 года по человеческим факторам в вычислительных системах (CHI '12). ACM, Нью-Йорк, Нью-Йорк, США, 463-472. DOI = 10.1145/2207676.2207740.

JigsawMap Example

Ответ 2

@edallme: Хороший документ, интересный!

@DaoWen:

То, что я понимаю в вашем сообщении, заключается в том, что вы ищете алгоритм для размещения всех блоков на карте, а не "виджета", чтобы сделать это (возможно, я ошибаюсь?).

Если вы просите идеи рассчитать, как размещать блоки (зная, что "сам график направлен и может быть сделан ацикличным" ), следующий метод должен работать независимо от того, какой графический lib вы используете.:

Вы можете попробовать - сначала создать карту зависимостей, например, каждая из node ограничена другими (относительное положение и смещение, например, SOUTH/30units). Этот кусок кода должен также проверять наличие непоследовательности.

Во-вторых, вычислите относительное положение каждого блока, где-то сохраняйте min и max (cf часть 3) и ссылку на объекты, имеющие позиции min/max.

В-третьих, вы должны иметь возможность фактически генерировать полноразмерные диаграммы с минимальными относительными позициями min/max.

Затем вам "просто" нужно нарисовать его из угла.