驚きの表現力のお絵かきプログラミング Context Free Art を試してみた

文脈自由文法でアートが楽しめる Context Free Art というのを試してみた。
Windows, Mac, Linux などで利用できて、簡単なコードを書けくだけで複雑な幾何学アートを生成してくれる。
サンプルから1つ
起動後、メニューの Example からいくつかのサンプルを試してみた。
たとえば、木を生成するサンプル「weighting_demo」のソースはこんなの。
startshape SEED1
rule SEED1 {
SQUARE{}
SEED1 {y 1.2 size 0.99 rotate 1.5 brightness 0.03}
}
rule SEED1 0.05 {SEED1 {flip 90}}
rule SEED1 0.05 {
SQUARE{}
SEED1 {y 1.2 s 0.99 r 1.5 b -0.5 flip 90}
SEED1 {y 1.2 x 1.2 s 0.6 r -60 b -0.5}
SEED1 {y 1.2 x -1.2 s 0.5 r 60 b -0.5 flip 90}
}
それっぽい木を生成してくれる。

確率的に描画してるので、メニューから Render→Render で再描画すると、また違った見た目の木ができあがる。
こんな簡単なルールの記述で自然界のものを記述できることが驚きだ。自然のものは案外、単純なルールと確率的な振る舞いで出来てるんだろうか。
文脈自由文法って?
Context Free という名前の通り、文脈自由文法でプログラムを記述する。文脈自由文法については 文脈自由文法 - Wikipedia が詳しいんだけど、小難しくてよく分からん。どうやら、プログラミング言語の文法定義に出てくる「A は A か B」みたいなやつのようだ。BNF も文脈自由文法を記述するための方法らしい。
Context Free Art では文法を定義するような感じで、図形のルールを記述していく。変数や関数もないし、凝ったことはできないんだけど、幾何学模様や木のような自然界のものは短いコードで描画できる。できあがった絵は、ちょっと値を変えるだけで見た目が大幅に変わるし、ちょっとした実験が気軽にできて楽しい。
ためしに作ってみた
自分でも作ってみようと 文脈自由絵画 Context Free Art http://contextfreeart.org - 言語ゲーム の解説を参考に、改造していった。

なんかそれっぽいのができた。ソースはこんなの。詳しくは次回解説する。
startshape Test
rule Test{
CIRCLE { h 30 sat 1 b 1 }
Test { x 1 s .9 r 10 h 30}
}
rule Test{
Test { flip 180 }
}
rule Test .2{
Test { flip -30 s .7}
Test { flip 30 s .7}
Test {}
}