ライフゲーム #22

前日にdotで使用するために検討した際の見栄えがシンプルでいい感じだったので、
vis_alive.gをそういう感じに描画されるように変更してみた。

vis_alive_2.g
BEGIN {
  if (ARGC != 1) {
    printf(2, 'usage: gvpr -f vis_alive_2.g -a size\n');
    exit(0);
  }

  double size = ARGV[0];
  if (size <= 0) {
    printf(2, 'error: size must be positive value: %f\n', size);
    exit(0);
  }

}

N [alive] {
  fillcolor = 'black';
  style = 'filled';
}

N {
  width = size;
  height = size;
  shape = 'box';
  if (! style) style = 'invis';
  pos = sprintf('%f,%f!', xOf(name) * size, yOf(name) * size);
}

E {
  style = 'invis';
}

元のプログラムとほとんど変わらない。
変更の要点は、N [alive]節にマッチせず、style属性を設定されなかったノードに対して、
全てのノードにマッチするN節において'invis'をstyle属性に設定することにある。
これによってstyle属性に'filled'が設定されているalive属性付きのノードのみが描画される。

試してみる。

diehard.txt
7,5
8,5
8,6
12,6
13,4
13,6
14,6
gvpr -f gen_mesh.g -a 19,23 | gvpr -cf set_gen0.g -a diehard.txt | gvpr -cqf vis_alive_2.g -a .05 | neato -Nlabel="" -T png -o diehard_0.png

三番目のgvprのオプションにqを付けたのは、
style属性の付いているノードより先にstyle属性のないノードに対してN節のアクションが実行された時に、
存在していない属性を初期化する旨の警告が出るため、これを防止する目的である。
これは一つのグラフにつき一回行われるだけなので上のコマンドでは一つ警告が出るだけだが、
vis_alive_2.gを何回も実行するような時にその都度警告されると煩いので付た方が良いと思う。

グリッドも描画するvis_alive.gは位置関係が分かりやすいが、
aliveが無ければ空白、というように割り切っているこれもシンプルでいい感じだ。