
↑ContextFreeで作りました(コードは末尾)。アナログ万歳的なエントリの直後にナンだが、こういうのも面白いっす。
デジタルアートではProcessingなんかが有名ですが、こちらの方は単純で手軽に楽しめる。プログラミングというよりは、頭の体操的な面白さがあります。かなり強烈な凄腕デモもあるので、触発された人は、チャレンジしてみてはいかがでしょうか。
サイトのマニュアルがわかりにくいので、取っ付きにくいかもしれません。ちょっと触り方書いてみます。
四角を書いてみる
描画関数をruleと呼びます。基本ruleは、SQUARE/TRIANGLE/CIRCLEの3つしかありません。ruleは、自分で定義できます。startshapeで、開始します。
startshape Something
rule Something {
SQUARE{
x 0
y 0
r 0
saturation 1
brightness 1
hue 0
alpha 0
size 1 1
skew 0 0
}
}
と書いたら、Renderボタンを押すと、赤い四角が現れます。適当に、以下のパラメータをいじって、変化を確認してみてください。
saturation 彩度 0~1
hue 色相 0~360(赤 0くらい 緑 90くらい ..etc)
brightness 輝度 0~1
alpha 透明度 -1~0
r 回転 0-360
skew 0 0 x/yシアー 0~360
完全なリファレンスはこちら。
それぞれのパラメータ名は長いので、通常は省略形を使う。次のように書いても同じです。指定しなければ、それぞれデフォルト値を使います。
startshape Something
rule Something {
SQUARE{ x 0 y 0 r 0 sat 1 b 1 h 0 a 0 s 1 1 skew 0 0}
}
再帰
オモシロイのはココからで、rule Somethingを再帰的に呼び出します。これがContextFreeの醍醐味。
x をずらして size を小さくしながら、hue(色)を変えて、回転(r)させると、
startshape Something
rule Something {
SQUARE{ x 0 y 0 sat 1 b 1 h 0 a 0 s 1 1 }
Something{ x 0.5 s 0.9 r 20 h 10 }
}
こんな絵になります。

このコードと絵が頭の中でリンクしたら、シメタもの!
再帰の終了条件は、sizeが0になること(※)なので、とりあえずは size を小さくしていくといいかも。
※だと思うが、それだけではなさそうだ。とりあえず何をやっても「永久ループで固まる」ということはナイので、安心してガンガン試すべしっ。
指定回数の繰り返し
再帰の終了条件を明記(プログラム)できないので、繰り返しを指定したい場合は、↓このようにします。
startshape Something
rule Something {
3*{x 1}CIRCLE{ sat 1 b 1 h 0 }
}
この例では、x 軸を変えながら、3回CIRCLEを描画しています。
これを応用して、カラーマップを作ってみると、
startshape ColorMap
rule ColorMap {
35*{y 1 b 0.03}Line{}
}
rule Line {
35*{x 1 hue 10}SQUARE{ x 0 y 0 sat 1 b 0 h 0 a 0 s 1 }
}

確率による「ゆらぎ」
startshape Something
rule Something 2 {
SQUARE{ sat 1 b 1 h 0 a 0 s 1 }
Something{ x 0.5 s 0.9 r 20 hue 10 }
}
rule Something 0.5 {
CIRCLE{ sat 1 b 1 h 0 a 0 s 1 }
Something{ x 0.5 s 0.9 r 90 hue 10 }
}
とすると、
2/(2+0.5)の確率で1つめのSomethingを、
0.5/(2+0.5)の確率で2つめのSomethingを実行します。
確率なので、Renderを押すたびに、結果が変わります。
あとはテキトーにガンバって。
正直、偶然の産物というか、狙ってできるもんじゃないというかw
思い通りに行かないと異様にモンモンします。そういうところも面白いです。3Dの表現方法もあるので、興味ある人はこのあたりも読んでみて下さい。
冒頭の絵、題して「ガーデン」。のコード
startshape Garden
rule Garden{
Window{}
}
rule Window 5{
Flower{}
Window{ s 0.6 x 1 a -0.5 r 30 }
Window{ s 0.6 x -1 a -0.5 r 60 }
}
rule Window 2{
Window{ s 0.98 y 1 a -0.5}
}
rule Flower{
CIRCLE{ s 1 sat 1 b 1 hue 100 skew 30 0 a -0.5 }
Flower{ x 1 hue 10 r 70 s 0.9 a 0.1}
}