2011-10-12 3 views
4

나는 진흙의지도를 그리려하고있다. 당신은 우리가 일부 지역 및/위/아래 우리가 다른 위치로가는 E/W/S/N가는이 볼 수 있듯이드로잉 진흙지도

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

: 내가 좋아하는 뭔가를 얻을 수 파이썬과은 GraphVIZ을 사용했다.

graphviz에서 서쪽 위치의 오른쪽에있는 북쪽 위치와 동쪽 위치를 갖도록이지도를 그릴 수 있습니까?

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

          N S 

          | | 
           \/ 
           ` 
          some location 3 

아니면은 GraphVIZ보다 자동으로 그릴 더 좋은 도구가있다 :

나는 그런 의미?

+0

나는, 모든 경우에 올바른 *와 * 읽을지도를 생성 할 수 있다고 생각하지 않습니다 N/S 및 E/W 축 때문에 진흙에는 실제로 적용되지 않습니다. 예를 들어 사용자는 "일부 위치"에서 "일부 위치 3"까지 E/W 연결을 가질 수 있습니다. 이는 "(N/S 축의 같은 높이에 있음을 의미하는) 순진한 구현" N/S 축에서 정확히 1 걸음을내는 다른 경로가 있다는 사실은 그들이 다른 높이에 있다는 것을 암시합니다. –

+1

더러운 일입니다 –

답변

1

을 사용하여 각 노드의 수직 레벨을 강제 설정할 수 있습니다. 이것은 물건들이 남쪽에서 북쪽으로 올바른 순서에 있음을 보증 할 것입니다. MUD 맵을 사전 처리하여 순위를 알아 내야합니다. 노드 그룹에 "동일한"등급으로 레이블을 붙입니다. 머드 맵을 처리하고 북/남 방향으로 동일한 레벨에있는 모든 룸 노드 그룹을 결정할 수 있습니다. 예 :

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

나는 수평 순서를 강제 할 수있는 방법을 찾을 수 없습니다 나는이지도를 들면

R1 R2 
|  | 
R3 -- R4--R5 

, 당신은 같은 것을 가질 수 있습니다. 이것은 East/West가 여전히 올바르게 일렬로 정렬되지 않았 음을 의미합니다. 다른 방이 상황을 파악하는 데 도움이되므로 순위 설정이 완료되면 90 %의 시간 동안 작동 할 수 있습니다.

+0

고맙습니다. 어떤 순위가 동일한 지 알기 위해 모든지도를 분석 할 필요가 없습니다. 여전히 관심이 있습니다. – Adam

1

는 더 나은 그래프

을 구성하는 방법이 될 수 있습니다 (dotguide 17 페이지 참조) 서브 그래프가와 순위 속성 (dotguide 23 페이지 참조) 생각 graphviz를에 대한 대안이 될 수있는 다음

5

사람들은 이전에 대한 improving Graphviz layout을 요구했다 파이썬을 통해 제어 할 수 있습니다,하지만 난 graphviz를 잔인한 여기라고 생각합니다.

이 같은 표준 MUD 레이아웃이있는 경우 : simple MUD layout

... 다음 객실이 어디에 있는지에 대한 몇 가지 매우 강력한 제약을 있어요. graphviz를 그 제약에 대해 알고하지 않습니다, 그래서 같은 간단한 알고리즘으로 좋은 일을하지 않을 것이다 :

  1. 트래버스 예를 들어, 사용하여 각 방을 통해 그리드에 시작 위치를 선택당신이 시각화 코드를 작성하지 않을 경우 depth-first traversal
  2. 이동 하나 개 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)