昔からProcessingがやりたかったのだけど、なかなかいい機会がなく放置していた。

しかし、ClojureでもProcessingをベースにしたQuilというライブラリがあることを知り、どうせClojureを勉強しているのだから、と早速使ってみた。

基本中の基本だとこんな感じ。

( defn setup [] ( q/background 255 )) ( defn draw [] ( q/rect 0 0 10 10 )) ( q/defsketch example :setup setup :size [ 100 100 ] :draw draw )

表示される画像がこれ：

なんとなく、やってることの割にはコードが多くてあまりいい印象じゃない。パワポでやった方が早いし・・・

しかし、コードでやることですぐあらわれるメリットとしては、要素を定義していってドンドン組み合わせていけること。

というわけでdraw関数の中身をboxという別の関数に定義して、drawの中でboxを複数回呼び出してみる。translate関数で画像が描かれる位置がずれるとのこと。

( defn setup [] ( q/background 255 )) ( defn box [] ( q/rect 0 0 10 10 )) ( defn draw [] ( doseq [ i ( range 3 )] ( q/translate ( * i 10 ) 5 ) ( box ))) ( q/defsketch example :setup setup :size [ 100 100 ] :draw draw )

結果がこれ：

期待していたものと違う。（本当は横並びの三つの箱を期待していた）

昔のturtle graphicsのように、ペン先が戻らない仕様らしい。いちいちtranslateで戻すかなー面倒だなーと思って調べていたところ、push-matrixとpop-matrixというよくわからない名称の関数があり、このような画像に対するtransformationをローカル化できるようだ。

ついでにこの「箱三つ並び」という図形も関数化しておく。

( defn setup [] ( q/background 255 )) ( defn box [] ( q/rect 0 0 10 10 )) ( defn line-of-boxes [ n ] ( doseq [ i ( range n )] ( q/push-matrix ) ( q/translate ( * i 10 ) 5 ) ( box ) ( q/ pop -matrix ))) ( defn draw [] ( line-of-boxes 3 )) ( q/defsketch example :setup setup :size [ 100 100 ] :draw draw )

これでいい感じ：

あとはこれらを組み合わせていったり回したり色をつけたり。

( defn setup [] ( q/background 255 )) ( defn box [] ( q/rect 0 0 10 10 )) ( defn line-of-boxes [ n ] ( doseq [ i ( range n )] ( q/push-matrix ) ( q/translate ( * i 10 ) 5 ) ( q/fill ( * 255 ( / ( - n i ) n )) ( * 255 ( / i n )) ( * 255 ( / i n )) 50 ) ( box ) ( q/ pop -matrix ))) ( defn draw [] ( q/translate 50 50 ) ( doseq [ i ( range 12 )] ( q/rotate ( Math/toRadians 30 )) ( line-of-boxes 3 ))) ( q/defsketch example :setup setup :size [ 100 100 ] :draw draw )

だんだんそれっぽくなってくる。

あとは、色のグラディアントを別に定義して、作った図形とうまく組み合わせるような、そういうプログラム構造はできないものか。かなり遊びがいがありそうである。