Graphviz
Graphvizはグラフを生成/描画するソフトウェアで、doxygenのクラス継承図なんかの生成にも使われている。今までdoxygenを通して使ったことしかなかったが、実は凄い興味があった。そこで、graphvizを通して自分でグラフを作る方法を調べてみたら"超"簡単だった。
方法はdotという形式のファイルを生成して、dot(graphvizのコマンド名)に喰わせれば言い。例えば、
digraph G { node [shape = "ellipse"]; "Node 1" [shape = "box"] "Node 1" -> "Node 2"; "Node 2" -> "Node 1" -> "Node 3" -> "Node 4" -> "Node 2"; }
digraphは有向グラフを意味する。後は説明が無くても意味が分かるんじゃないかな? 念のため、ちょっと説明しておくと"XX" -> "YY"で節点XXから節点YYへの有向辺が引かれるというわけ。これで生成されるのが、上にある画像だ。
こういうのを見ると作りたくなるのがC++*1でグラフ構造を表すクラスからdot形式のファイルを生成するものや、直接graphvizライブラリを呼び出して、グラフを生成したりGTK+(C++なので、gtkmmか)で表示したりするライブラリ。
まぁ、『作ってみたいものリスト』にいれておこう。
そうそう、偶然だけど面白いことを発見した。知っている人は知っているんだろうけど、displayコマンド(ImageMagicの画像表示コマンド)でdotファイルを喰わせて、画像を表示できる。だから、冒頭のサンプルdotファイルを任意の名前で保存して(仮にgraph.dotとする)以下のコマンドを叩けば画像を表示できる。
display graph.dot
おぉ、簡単。内部でgraphvizを使ってるのかも知れないので、graphvizは必要だと思う(未確認)。
余談だけど、こういう良くできたソフトウェア*2を見るとプログラマの端くれとして感動しちゃんだよね。すごい悔しくもなるし。モチベーションがあがる。
【追記】
グラフ周りの実装ではGraph Template Library(GTL)ってのがありますね。使用感、その他不明。