10

我用: 编译下图dot graph.dot -Tpdf -ograph.pdf,产生:

在此处输入图像描述

结果还可以,但是状态转换看起来很像一个 spagetthi 怪物,我不知道我可以做些什么来解决这个问题。我尝试了其他布局:twopi, neato, etc.是否有允许它强制图形看起来更对称的参数?因为整体画面还可以。

对我来说,边缘似乎使用了最小的空间来构建边缘描述,也许这就是问题所在?

我的图形设计有缺陷吗?我应该在一个边缘上写不同的状态转换,使用 \n 来分隔不同的转换吗?

digraph finite_state_machine {
    rankdir=LR;
    edge [fontsize=26];
    node [shape = doublecircle, width=2.0, fontsize=24, fixedsize=true,style=filled, colorscheme=spectral5]; New  [fillcolor=3] Terminated [fillcolor=5];
    node [shape = circle, width=2.0, fontsize=24, fixedsize=true, colorscheme=spectral5]; Runnable [fillcolor=4] Waiting [fillcolor=2] "Timed\nWaiting" [fillcolor=2] Blocked [fillcolor=1];
    New -> Runnable [ label = "Thread.start" ];
    Runnable -> Waiting [ label = "Object.wait" ];
    Runnable -> Waiting [ label = "Thread.sleep" ];
    Runnable -> Waiting [ label = "LockSupport.park" ];
    Waiting -> Blocked [ label = "Reacquire monitor lock after\nleaving Object.wait" ]
    Waiting -> Blocked [label = "Spurious wake-up"]
    "Timed\nWaiting" -> Blocked [ label = "Reaquire monitor lock after\n leaving Object.wait" ]
    "Timed\nWaiting" -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Blocked [ label = "Spurious wake-up" ]
    Runnable -> "Timed\nWaiting" [ label = "Object.wait" ];
    Runnable -> Blocked [ label = "Contended Monitor\nEnter" ];
    Blocked -> Runnable [ label = "Contended Monitor\nEntered" ];
    Runnable -> Terminated [ label = "Thread finishes\nexecution" ]
    Runnable -> Terminated [ label = "Exception" ]
    Waiting -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
        Waiting -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
}
4

1 回答 1

8

我不认为你的设计有缺陷,我认为没关系。点语法是可读的,因此是可维护的,其结果是自动生成的图形通常看起来很相似。

当然,您可以添加一些小的修正来使这个特定的图表更好(或至少不同)。例如,如果您的图表的源是由应用程序生成的,则其中一些可能难以实现。这里有一些想法:


为了使布局更加对称,您可以尝试对齐节点WaitingTerminated以及Timed WaitingBlocked ,方法是将它们的group属性设置为相同的值(group=agroup=b)。

分组节点

它适用于WaitingTeminated,但不适用于Timed WaitingBlocked ——可能是因为这些节点之间有两条边。

您可以尝试通过选择连接它们的边缘之一并将其weight属性设置为高值来理顺它们。

除此之外,我认为该图总体上看起来更好,因为边缘更平滑并且不必要的曲线更少,尤其是 - 但不仅是 - 在RunnableWaiting之间。


意大利面条效应是由于样条曲线 - 也许没有样条曲线看起来更少意大利面条?我尝试通过添加splines=compoundsplines=ortho(相同的结果):

组和化合物

该图使用的垂直空间略少。这不是意大利面,但在我看来并没有更好......


您也可以尝试splines=compound不使用组属性,这应该会使图形更紧凑(错误不一定更漂亮)。或者简单地利用边缘的重量来拉直特别令人不快的边缘。

在某些情况下,concentrate可以清除具有大量平行边的图——在这种情况下,它并没有真正的帮助。

于 2011-07-16T00:33:02.613 回答