Рисование карты грязи - PullRequest
       33

Рисование карты грязи

4 голосов
/ 12 октября 2011

Я пытаюсь нарисовать карту грязи.Я использовал Python и Graphviz, чтобы получить что-то вроде:

http://img23.imageshack.us/img23/5222/arrasz.png

Как вы можете видеть, у нас есть несколько локаций, и мы идем N / S / W / E / Up / Down, мы идемв другое место.

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

Я имею в виду так:

some        --- E --->   some
location   <--- W ---    location 2
                            .
                           / \   |
                            |    |

                            N    S

                            |    |
                                \ /   
                                 `
                          some location 3

Или, может быть, есть какой-то лучший инструмент для рисования автоматически, чем graphviz?

Ответы [ 3 ]

5 голосов
/ 12 октября 2011

Люди спрашивали об улучшении макета Graphviz раньше, но я думаю, что Graphviz здесь излишним.

Если у вас есть стандартный макет MUD, как это:

simple MUD layout

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

  1. Выберите начальную точку на сетке
  2. Пройдите через каждую комнату, используя, например, обход в глубину
  3. Переместить одну единицу в N, S, E или W для каждой новой комнаты

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

Редактировать: например, некоторый псевдокод:

visit(initialRoom, 0, 0)

def visit(curRoom, curX, curY)
  if curRoom == null return

  print "in room " + curRoom + " at location " + curX + ", " + curY

  visit(curRoom.northNeighbor, curX,   curY-1)
  visit(curRoom.southNeighbor, curX,   curY+1)
  visit(curRoom.westNeighbor,  curX-1, curY)
  visit(curRoom.eastNeighbor,  curX+1, curY)
1 голос
/ 12 октября 2011

Я думаю, что подграфы (см. dotguide стр. 23) и свойство rank (см. dotguide стр. 17) могут быть методами для лучшей организации графа

.следующие могут быть альтернативой Graphviz:

1 голос
/ 12 октября 2011

Вы можете использовать ранг узла , чтобы принудительно задать вертикальный уровень каждого узла.Это гарантировало бы, что вещи находятся в правильном порядке север на юг.Вы должны были бы предварительно обработать карту MUD, чтобы выяснить рейтинг.Вы помечаете группу узлов как «одинакового» ранга.Вы обработаете карту MUD и определите, какая группа узлов комнаты находится на одном уровне в направлении север / юг.Пример:

R1    R2
|     |
R3 -- R4--R5  

Для этой карты у вас может быть что-то вроде этого:

digraph M {
    R1->R3;
    R2->R4;
    R3->R1;
    R3->R4;
    R4->R2;
    R4->R5;
    {rank=same;R1;R2}
    {rank=same;R3;R4;R5}
 }

Я не могу найти способ форсировать горизонтальный порядок.Это означало бы, что Восток / Запад все еще не могли бы выстроиться правильно.Это может сработать в 90% случаев, если у вас есть настройка ранга, потому что другие комнаты помогут создать контекст.

...