ライフゲーム #24

第0世代のalive属性付きノードを設定するgvprフィルタset_gen0.gで使い辛い点は、
設定座標リストファイルで指定できるメッシュ座標が絶対座標であることだ。
パターン全体を平行移動して設定したいことはよく起きるので、
座標リストは相対座標であることにして必要に応じてパターンの移動量を指定できるようにする。

set_gen0.g
BEGIN {
  string filename;
  int x0 = 0, y0 = 0;
  switch (ARGC) {
  case 2:
    x0 = xOf(ARGV[1]);
    y0 = yOf(ARGV[1]);
  case 1:
    filename = ARGV[0];
    break;
  default:
    printf(2, 'usage: gvpr -cf set_gen0.g -a filename [-a x0,y0] [-o outfile] [infile]\n');
    exit(0);
  }

  int fd = openF(filename, 'r');
  string p[], s;
  int pn = 0;
  for (s = readL(fd); s != ""; s = readL(fd)) {
    s = substr(s, 0, length(s) - 1);
    p[pn++] = sprintf('%d,%d', xOf(s) + x0, yOf(s) + y0);
  }
  closeF(fd);
}

N {
  int i;
  for (p[i]) {
    if (name == p[i]) {
      alive = 1;
      break;
    }
  }
}

省略可能な第2引数でx方向とy方向の移動量を"x,y"形式で指定する。
省略された場合は移動量はともに0になり、リストの座標は今までと同じ扱いになる。

still.txt
0,1
1,0
2,0
3,1
2,2
1,2
1,4
1,5
2,5
2,4

移動量を指定しない場合、

gvpr -f gen_mesh.g -a 4,6 | gvpr -cf set_gen0.g -a still.txt | gvpr -cf vis_alive.g -a .1 | neato -Nlabel="" -T png -o still_0.png


今まで通りである。
メッシュサイズを大きくしてその中央にパターンを置きたい場合、

gvpr -f gen_mesh.g -a 10,10 | gvpr -cf set_gen0.g -a still.txt -a 3,2 | gvpr -cf vis_alive.g -a .1 | neato -Nlabel="" -T png -o still_0.png


今までだとstill.txtの再編集が必要だったので楽ができる。