Context Free の続き。
まず以下のコード
startshape main
rule main {
CIRCLE{z 1 b 1}
TRIANGLE{s 2}
}
rule main 2{
CIRCLE{s 1.2 z -1}
TRIANGLE{b 1 flip 0 }
}
Context Freeの特徴の一つだと思うんだけど、
同じ名前のルールがあるとランダムにどちらかを選んでくれるのだ。
この場合 main という名前のでそれぞれ違う図形を描くルールを2つ作っている。
renderボタンを押す(command + R)とどちらかのルールが描かれる。
そして、それぞれのルールの名前の後に数字を入れる事で
ランダムに選ばれる確率を制御できる、これが重要。
この場合上の main は数字を入れていないので 1 を入れているのと同じ扱い。
この場合、1:2の割合になるので それぞれ1/3と2/3の確率で選ばれるという事になる。
ちなみに前回使わなかった z や flip を使っているのでその説明も。
z 数字 //z位置を移動、ただし3D空間ではないので、レイヤーの順番を決める感じ。
数が大きい方が手前に表示される。
上の使い方だと、丸の表示位置を三角より手前にするか奥にするのかを指定するのに使っている。
flip 角度 //その度数の角度の線で反転。例えばflip 0だと0度の線つまり水平な線に大して図形を反転するので上下が逆になる、flip 90 だと左右が逆になる。
startshape main
rule main{
CIRCLE{}
main{s .9 x 1 rotate 30}
}
Context Freeの一番の特徴だと思うのがこれである。
mainという名前のルールの中にまたmainがでてくる、
つまり自分自身を描く命令をしている、
そしてそのmainの中にもmainがいるわけで無限ループが出来上がっているわけです。
しかし、無限に描き続けると困るので、止まる条件もある。
s .9 の部分だ、これは main を実行して CIRCLE を書いて
サイズを .9に小さくしてまたmainを書く。
つまりだんだん小さくなってある程度まで図形が小さくなったら描くのを止めましょうってゆう意味。
だからサイズを小さくしないで 無限ループなルール作っても実行されない。
だいたいこれがわかればcontext freeっぽいものは描けると思う。
そしてやっぱりcontext freeを使ったら木を書いてみたくなると思うので、
このブログのタイトルバックに使っている木のコードを解説。
startshape tree
rule tree{
point{}
tree{s .93 y 1 r 9 b .04 }
}
rule tree .3{
tree{}
tree{ flip 90}
}
rule point{
CIRCLE{s 1 2 h 70 sat 1 b 0}
}
これだけ、簡単。
まず point ってゆうのはサイズでyを2倍にして縦長にした円、
色(hue)は緑だけど明るさ(brightness)を0にして最初は黒にしている。
treeというルールは二つあってそれぞれ 1:0.3 の比率でランダムに選ばれる。
上のtreeは point をすこしずつ上に移動させながら回転させてえがいていく。
b .04 ってしているので描くたびにすこしずつ色が明るくなって
葉っぱの方が緑に見えるようにしてる。
そしてもう一つの tree は tree を描きながら 左右反転させたtree も描いている。
このおかげでたまに枝分かれしたようになっているってわけです。
それぞれの tree 比率を 0.3 から 0.2 とかに変えるだけで形が結構かわってくるのがおもしろい。
今日はここまで、また続き書きます。


0 コメント:
コメントを投稿