Рисование возвратных граней в автоматах - PullRequest
4 голосов
/ 28 апреля 2010

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

Проблема в том, что рендеринг в 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"];  
}

Рендеринг конечного автомата http://img91.imageshack.us/img91/2300/previewom.png

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

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

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

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

1 Ответ

5 голосов
/ 28 апреля 2010

Итак, если найден обходной путь, но на самом деле не ответ на мою проблему.
Хитрость заключается в том, чтобы иметь невидимый узел, который подключается к исходному состоянию. тогда начальное состояние не является вершиной иерархии, и каждый имеет немного больше свободы в размещении узлов. Кроме того, атрибуты 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 или альтернативе для отображения конечных автоматов приятным способом.

...