ライフゲーム #6
どうも斜めになっているのが少し気になる。
ノード名がメッシュ上での座標としているので、これを利用してノードにpos属性を与えてみる。
gvpr -c -f vis_alive.g blinker_0.gv | gvpr -c "N{int x,y;sscanf(name,'n%d_%d',&x,&y);pos=sprintf('%d,%d',x,y);}" | neato -Tpng -oblinker_0.png
各ノードごとに、"nx_y"という形式のノード名からxとyを取り出して、
"x,y"の形式に整形したものをpos属性として与えている。
第0世代
どうやらうまくいっているようだ。
二重にフィルタリングするのも面倒なので、視覚化用フィルタのvis_alive.gに統合してしまおう。
vis_alive.g
N [alive] { color='lightblue'; style='filled'; } N { int x, y; sscanf(name, 'n%d_%d', &x, &y); pos = sprintf('%d,%d', x, y); }
こういうのを書かないといけないとなると、
ノード名を"x,y"の形式にしておいた方が良かったかもしれない。
それなら、ノード名をそのままpos属性の値として与えてやれば済む。
実のところ最初は"x,y"形式も考えたのだが、現在のノード名の形式"nx_y"にしたのは、
DOT形式で書いたときに二重引用符で囲む必要がないため、
二重引用符で囲まなければならない"x,y"の形式より1文字ケチれるという吝嗇な理由なのだった。
この辺りはまた機会があれば考えてみよう。
さて、これで前と同じコマンドで画像化できる。
gvpr -c -f vis_alive.g blinker_1.gv | neato -Tpng -oblinker_1.png gvpr -c -f vis_alive.g blinker_2.gv | neato -Tpng -oblinker_2.png