Рисование рефлексивных ребер в конечных автоматах

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

Проблема в том, что рендеринг в Graphviz дает некрасивые результаты.

digraph finite_state_machine {  
    edge [fontsize=11];
    
    S0 -> S0 [label = "td=1\n-/e2"];   
    S0 -> S1 [label = "td=3 \n-/e3" ];  
    S1 -> S0 [label = "td=3\n-/-\nt=0"];  
    S0 -> S2 [label = "P:i1/e4"];  
    S2 -> S0 [label = "td=0\n-/-" ];  
    S0 -> S0 [label = "i1/e1\ntd+=1"];  
}

Визуализация конечного автомата

Есть ли способ сделать этот вид немного лучше?

Кстати: я попробовал head/tailport, но они не работают в моей версии Graphviz (1.13 в Mac OS X)

Я не ограничен точечным движком, мне нужен только красивый график, и меня не волнует средство визуализации/язык.

Большое спасибо


person reforged    schedule 27.04.2010    source источник


Ответы (1)


Итак, если бы нашел обходной путь, но на самом деле не ответ на мою проблему.
Хитрость заключается в том, чтобы иметь невидимый узел, который подключается к начальному состоянию. тогда начальное состояние не является вершиной иерархии, и у вас есть немного больше свободы в размещении узлов. Кроме того, атрибуты head/tailport работают должным образом. Результат - если не такой красивый, как хотелось бы - смотреть можно.

digraph finite_state_machine {  
  edge [fontsize=7];
  fontsize = 11;
  rankdir=LR;
  {rank = same;null}
  {rank = same; S0}
  {rank = same; S1 S2}
  nodesep = 1;
  ranksep = 1;

  null [shape = plaintext label=""];
  null -> S0;
  S0 -> S0 [label = "td=1\n-/e2", tailport = n, headport = n]; 
  S0 -> S1 [label = "td=3 \n-/e3" ];
  S1 -> S0 [label = "td=3\n-/-\nt=0"];
  S0 -> S2 [label = "P:i1/e4"];
  S2 -> S0 [label = "td=0\n-/-" ];
  S0 -> S0 [label = "i1/e1\ntd+=1" headport = s tailport = s];
}

http://img532.imageshack.us/img532/4083/previewd.png

Хотя это работает (для этого конкретного примера), мне все же очень хотелось бы получить совет по dot/Graphviz или альтернативе для приятного рендеринга конечных автоматов.

person reforged    schedule 27.04.2010