绘图泥图

时间:2011-10-12 12:18:23

标签: python graph visualization graphviz mud

我正试图绘制一些泥土的地图。我使用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更好的自动绘制工具?

3 个答案:

答案 0 :(得分:5)

人们之前曾询问improving Graphviz layout,但我认为Graphviz在这里过于苛刻。

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

simple MUD layout

...那么你对房间的位置有一些相当<强烈>强烈的约束。 Graphviz不知道这些约束,因此它不会像简单的算法那样做得好:

  1. 在网格上选择一个起始位置
  2. 使用例如每个房间穿过每个房间。一个depth-first traversal
  3. 将每个新房间的一个单位移至N,S,E或W
  4. 如果您不想编写可视化代码,您可以(可能)将上述方法作为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 :(得分:1)

您可以使用node rank强制每个节点的垂直级别。这样可以确保东西向北正确。您必须预处理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%的时间内工作,因为其他房间将有助于给它上下文。

答案 2 :(得分:1)

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

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