4

我正在尝试绘制一些泥浆的地图。我使用 python 和 graphviz 得到了类似的东西:

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

正如您所看到的,我们有一些位置,并且会前往 N/S/W/E/Up/Down,我们将前往其他位置。

是否可以使用 graphviz 绘制此地图以使北部位置在南部,东部位置在西部位置的右侧?

我的意思是这样的:

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

                            N    S

                            |    |
                                \ /   
                                 `
                          some location 3

或者也许有比graphviz更好的工具来自动绘制它?

4

3 回答 3

5

人们之前曾询问过如何改进 Graphviz 布局,但我认为 Graphviz 在这里有点矫枉过正。

如果您有这样的标准 MUD 布局:

简单的 MUD 布局

...那么您对房间的位置有一些相当严格的限制。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)
于 2011-10-12T13:30:28.150 回答
1

我认为子图(参见dotguide第 23 页)和 rank 属性(参见dotguide第 17 页)可能是更好地组织图形的方法

以下可能是 Graphviz 的替代方案:

于 2011-10-12T12:58:26.190 回答
1

您可以使用节点等级来强制每个节点的垂直级别。这将确保事情的正确顺序是从北到南。您必须对 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% 的时间内起作用,因为其他房间将有助于提供上下文。

于 2011-10-12T12:32:43.867 回答