绘制泥地图

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更好的工具可以自动绘制它吗?

我认为在所有情况下都不可能生成正确且可读的地图,因为在MUD中并没有真正强制使用南/北和东/西轴。例如,您可以从“某个位置”到“某个位置3”建立东/西连接,这意味着(对于一个天真的实现)它们在相同的高度上(在南/北轴上),而事实上,在它们之间有另一条仅需1步南/北轴路程的路径,这意味着它们处于不同高度。 - Joachim Sauer
4个回答

5
人们之前曾询问如何改善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

你可以使用节点等级来强制每个节点的垂直级别。这将确保事物按照南北正确的顺序排列。您需要预处理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%的情况下可以工作,因为其他房间会帮助它获得上下文。


谢谢。这很有帮助。但是,如果有人知道一种不需要分析所有地图就能知道哪些排名相同的方法,我仍然很感兴趣。 - Adam

1

0

要在Graphviz中建立一个网格地图,您可以使用neato引擎,并通过坐标绝对定位节点nodename [pos="coordinateX,coordinateY"]。 Graphviz代码:

digraph Mud_Map {
    layout=neato
    splines=ortho
    node [label="" width=.5 height=.5 pin=true shape=box]
    "n0,0" [pos="0,0"]
    "n1,0" [pos="1,0"]
    "n1,-1" [pos="1,-1"]
   
    "n0,0" -> "n1,0" [xlabel="E"]
    "n1,0" -> "n0,0" [xlabel="W"]
    "n1,0" -> "n1,-1" [xlabel="S"]
    "n1,-1" -> "n1,0" [xlabel="N"]
}

图片:
使用 Graphviz Neato 生成的泥地地图图表
来源


或者使用更复杂的解决方案,采用 dot 引擎:

digraph Mud_Map {
    layout=dot
    splines=ortho
    nodesep=.5
    
    // our custom grid
    node [shape=box]
    // arbitrary path on rigid grid
    A0 -> B0 [xlabel="E"]
    B0 -> A0 [xlabel="W"]
    B0 -> B1 
    B1 -> B0

    // main "underground" grid:
    edge [style=dashed color=dimgrey]
    // uncomment line below to hide the grid:
    //edge [style=invis]
    // uncomment line below to hide the A1 node:
    //A1 [shape=none label=""]
    A0 -> A1
    B0 -> B1
    rank=same {A0 -> B0 }
    rank=same {A1 -> B1 }
}

没有取消注释的行的图像:
用graphviz dot制作的显示边缘的泥地地图图形
有取消注释的行的图像:
用graphviz dot制作的隐藏边缘的泥地地图图形
参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接