驚きの表現力のお絵かきプログラミング 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 {}
}