Context Freeが楽しい

Context Freeは簡単なrule(規則)を記述するだけで美しい絵が描ける、グラフィック生成プログラミング環境です。

こちらからアートギャラリーを見たり、Context Freeのダウンロードができます。
http://www.contextfreeart.org/

とりあえず私がちょこちょこと描いてみた例をば。
木。
[
カラフル曲線。
[
目の錯覚。


詳しい(といってもとっても簡単な)ruleの文法は、
http://www.contextfreeart.org/mediawiki/index.php/Reference_Card
にまとまっています。


例えば、上の「木」を描くためのルールはこんな感じです。

startshape tree

rule tree {
	SQUARE { s 2 1 b .5 sat 1 }
	tree { y 1 h .3 }
}

rule tree  .04 {
	tree { r 20 s 0.8 }
	tree { r -20 s 0.8 }
}

名前の通り文脈自由文法というやつですね。
ちょっとこれを説明してみます。

  • startshape tree : 描き始めは tree というルールだよ、という指定。
  • rule tree { : treeの描き方。
    • SQUARE { s 2 1 b .5 sat 1 } :正方形を1つ描きます。 {}の中は色や大きさ指定ですが、後で説明します。
    • tree { y 1 h .3 } :位置と色を変えて、再度treeを描きます。いわゆる再帰ですね。
  • } : treeの描き方ここまで

ここで、{} の中について。{} 内は adjustments と呼ばれる大きさや角度、色などの調整をするものです。
例えば、再帰呼び出しの tree {} 内の y 1 は、y方向に1ずらして tree のruleルールに従って描画する、という意味になります。これで再帰呼び出しのたびに木が上に伸びていくことを表現していることになります。
SQUARE内の s 2 1 は、size 2 1の省略形で、x方向 2、y方向 1 の大きさに拡大/縮小するということです。
b .5 sat 1 や h .3 は色の指定です。色は HSB で指定します。ここでは明るさ0.5、彩度 1に指定し、再帰する度に色相を0.3°ずらしています。


これだけだと、永久に y を1ずつ増やしながらSQUAREを描き続けてしまうので、次のルールが必要になります。

  • rule tree .04 { : treeのrule 2つめ。複数定義するとランダムに選択されます。.04はランダムの重みです(省略時は1)。
    • tree { r 20 s 0.8 } : 角度を20°回転、大きさを8割にして tree のルールを描きます。
    • tree { r 20 s 0.8 } : 逆方向にも回転させて同じことをします。これで枝分かれします。

}

Context Freeでは、ある程度大きさが小さくなると描画を止めます。
上のtreeでは、2つ目のruleが選ばれる度に大きさが小さくなるので、何回か枝分かれしたところでそのうち止まるわけです。


ruleの選択はランダムなので、何度も実行するとちょっとずつ違う木を描けます。また分岐の重みや回転の角度を少し変えるだけでかなり違った様相の木になります。なかなかおもしろいですよ。


他の図形のruleも書いておきます。
カラフル曲線。

startshape STROKE

rule STROKE {
	stroke { b 1 sat 2 }
}

rule stroke {
	SQUARE {}
	stroke { y 1 s 0.991 r 2 h 1 }
}

rule stroke 0.04 {
	stroke {}
	stroke { r 60 s .3 }
}

rule stroke 0.01 {
	stroke {}
	stroke { r 120 }
}

目の錯覚

startshape CIRCLES

rule CIRCLES {
	CIRCLE { b 1 sat 1 }
	CIRCLES { y 1 h 1 r 10 s 0.9995 }
}

次は3次元版のStructure Synthで遊んでみる予定。