在制作图形时,我有完美瘫痪。如果视觉的对称性没有被充分探索,我就很难理解正在发生的事情。我也是一个非常视觉化的学习者,我喜欢简化我刚刚学到的东西并将它们画在纸上。

Graphviz 是一个很好的自动绘制工具,但它还可以更好。让我们从一个好的图(而不是状态机)的示例开始。别介意质量(可以用更好的工具重新绘制),这个几乎是完美的,除了我将其逆时针旋转 45 度以使对称性明显。然后,读者应该花更少的时间来弄清楚状态 q1 和 q2 有何相似之处以及它们有何不同。我认为,考虑到旁边没有其他图形,有一个最好的方法来表示该图。

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif
(来源: 画廊.hd.org)

现在让我们看一个不太完美的描述:

http://linux.softpedia.com/screenshots/Graphviz_1.png
(来源: 软百科网)

这看起来像是 graphviz 会生成的东西。是的,边缘很光滑,但是 GAAAAWWWD 这是不必要的混乱!它看起来像一张思维导图,而不是可供使用的成品图。我相信人眼渴望(同样)对称。是的,还有等级制度等等。也是重要因素。

我很惊讶没有更好的算法可用。有些人根本不是视觉学习者;他们可以通过阅读符号来掌握抽象概念。不是我!

那么,我的问题是什么?那么,有没有更好的免费软件可用于绘制中小型图形?也许

谢谢你!

让我知道如何改进这篇文章。

附:我花了10分钟在dia中画出了一个足够相似的克隆体。它仍然不完美,但制作起来很方便,因为一切都捕捉到网格(我错过了一些小细节,但不想重新上传)。LR_0需要一个来自上方的“Start--->”,让用户更快掌握启动状态。

Finate State Machine

有帮助吗?

解决方案

在绘制你的图,未能得到你认为“最好”的布局经过多次尝试之后,你在这里提出的问题: 有“[B]埃特免费软件[供]绘制小到中等的图表。“您已经给评估布局算法的唯一标准是他们如何紧密地走到了‘[S]英格尔最好的代表图的方式。’ “最好的”,当然,留给你来决定。

这是或多或少相同尝试使用一个给定的编程语言来解决一个问题,失败,然后要求更好的编程语言。

目前的图形绘制算法的心脏是优化例程产生然后评价溶液(“解决方案”在此指的坐标为每个节点,它们一起包括布局)。即,曲线图的一个或多个属性的最小化 - - 这些解决方案是根据单一标准的最小化或一系列的排名标准进行评价,例如,边的总数交叉,或者距离之和节点(或两者的组合,或这两种的一些加权组合),或贴近对称构型之间。的Graphviz由六个不同的布局算法(点NEATO,FDP,SFDP,twopi,和圆环)。这些,看来你只用点;然而,twopi和圆环可能是更好的选择,给这似乎符合自己一个正确绘制图表的想法他们的严谨对称的约束。

二,你的问题的文本是针对“图”和图形的绘制,阅读你的完整描述后,我不认为你的问题有什么关系或者概念。

除了一般性图形绘制算法(如graphviz的),还有一些的特定于域的布局算法,例如,哈斯图(以表示顺序理论部分有序集),Barabasi阿尔伯特曲线图(无标度网络),以及鄂尔多斯-仁义(随机图)。每个这些算法基于由所述结构域提供的标准和约束的图形布局 - 这应该以指示你不存在跨所有域的单一的“最佳”的布局。虽然你在你的问题中使用的术语“图形”,你的描述表明,您的问题与绘图状态机 - 一种高度特异类型的图表。通用图形绘制算法往往在绘制这类专门的图表,因为算法一无所知域差。事实上,我不知道的状态图任何布局算法 - 就像没有一个流程图(不一样的,但类似)。工作流程的角度来看,你可能会绘制graphviz的图形,然后将其导入到的OmniGraffle微调 - 中的OmniGraffle,你必须在节点和边缘的展示位置进行细粒度的控制。

其他提示

我知道有很多选择:

  • Prefuse - 他们有一个 较旧的 Java 版本. 。最新版本采用 Flash 格式,并具有一些漂亮的布局。它的名字叫 预引火炬. 。这 演示页面 说明了它的一些布局功能。
  • JUNG 包含许多布局选项,以及强大的图形分析功能。有一些例子 这里.
  • Networkx 还包括许多布局功能。其中一些已列出 这里.

一些软件允许用户调整布局算法在实时,只要用鼠标移动节点。这种方法可以大大地帮助你更大的图形。

我大多知道 Gephi (disclamer:我是DEV)

蒂克Z 产生 漂亮的图表布局. 。您可以使用手动布局来指定最少的提示,也可以要求自动布局。默认值很好,并且存在可以调整到完美的钩子。

使用半手动布局,您不必声明每个细节,因为您可以

  • 将节点声明为“上方”、“右下方”等。相对于其他节点。
  • 通过将节点作为矩阵输入将它们放置在栅格上:如果您想留出一些空位,非常方便。
  • 轻松指定边缘进入、离开、弯曲或拐角的方向

对于自动布局,TikZ 的 graphdrawing 图书馆有一些 相当流畅的算法.

以下是手动布局的示例以及用于获取它的 TeX 代码:

example graph

\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
                    semithick]
  \tikzstyle{every state}=[fill=red,draw=none,text=white]

  \node[initial,state] (A)                    {$q_a$};
  \node[state]         (B) [above right of=A] {$q_b$};
  \node[state]         (D) [below right of=A] {$q_d$};
  \node[state]         (C) [below right of=B] {$q_c$};
  \node[state]         (E) [below of=D]       {$q_e$};

  \path (A) edge              node {0,1,L} (B)
            edge              node {1,1,R} (C)
        (B) edge [loop above] node {1,1,L} (B)
            edge              node {0,1,L} (C)
        (C) edge              node {0,1,L} (D)
            edge [bend left]  node {1,0,R} (E)
        (D) edge [loop below] node {1,1,R} (D)
            edge              node {0,1,R} (A)
        (E) edge [bend left]  node {1,0,R} (A);
\end{tikzpicture}
\end{document}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top