言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

文脈自由絵画 Context Free Art http://contextfreeart.org

Context Free Art というのを試してみた。

再帰的な図形を簡単に描く為のプログラムらしい。いっちょやってみるか。例えば丸を描くのはこうする。丸 (CIRCLE) の他にも四角 (SQUARE) と三角 (TRIANGLE) が描ける。描ける図形は http://contextfreeart.org/mediawiki/index.php/Primitive_shapes に表がある。最初の startshape で図形の名前を指定して、その後に使いたい図形を書く。

startshape MARU

rule MARU {
  CIRCLE {}
}

赤く塗って日の丸にするには {} の中に丸の性質を書く。例えば赤にするために hue (色相 0 〜 360) saturation (彩度 -1 〜 1) brightness (明るさ -1 〜 1) を指定した。数字は相対値になる。他の性質は http://contextfreeart.org/mediawiki/index.php/Shape_adjustments に表がある。

startshape HINOMARU

rule HINOMARU {
  CIRCLE {hue 0 saturation 1 brightness 1}
}

図形を組み合わせて新しい図形を作れる。MEDAMA で赤と黒の目玉を作って、RYOUME で二つ並べる。ちなみに { x 1 } は左にに一歩ずれるという意味。

startshape RYOUME 

rule RYOUME {
  MEDAMA { x -1 }
  MEDAMA { x 1 }
}

rule MEDAMA {
  CIRCLE {}
  CIRCLE {size 0.5 hue 0 saturation 1 brightness 1}
}

ここからようやく Context Free っぽくなる。ある図形の定義に、自分自身を使う事が出来る。さっき値が相対値と書いたのは、例えば hue 15 というのは描けば描くほど色相を 15 ずつずらして描くという事。

startshape GURUGURU

rule GURUGURU {
  MEDAMA{}
  GURUGURU { x 1 size 0.9 rotate 40 hue 15}
}

rule MEDAMA {
  CIRCLE {}
  CIRCLE {size 0.5 hue 0 saturation 1 brightness 1}
}

ここからさらに面白くなる。同じルールを二つ作ると、勝手にどちらか選んでくれる。ルール名の後ろの数字は、選ぶ比率です。

startshape NYORO 

rule NYORO {
  MEDAMA{}
  NYORO { x 1 size 0.8 rotate 20 hue 15}
}

rule NYORO 0.2 {
  NYORO {}
  NYORO { flip 0 }
}

rule MEDAMA {
  CIRCLE {}
  CIRCLE {size 0.5 hue 0 saturation 1 brightness 0.9}
}

このように、気持ち悪い図形が幾らでも作れます。

ちなみに、有名な Aza Raskin 氏による Javascript 版もあります。 http://azarask.in/projects/algorithm-ink