ライフゲーム #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

第1世代

第2世代

傾いていたのが修正され、世代間で図の大きさも合ってくれた。