積読中だった「関数型オブジェクト指向AIプログラミング」にフラクタルの話が出ていたのを思い出したのでQuilでやってみる。

ちなみにこの本はScalaで、フラクタルに関して出てくるコードはどこをどう見ても相当オブジェクト指向なのが少し不思議。パッと見た限りあまり好みのコードではないが・・・

とりあえずclojure+Quilに書き直してみる。

まずは、描線関数。角度をラジアンでとるのと、次の起点が今描いた線の先にあるのがポイント。

( ns koch-fractal ( :require [ quil.core :as q ])) ( defn forward [ len angle ] (let [ x ( * len ( Math/cos angle )) y ( * len ( Math/sin angle ))] ( q/line 0 0 x y ) ( q/translate x y )))

再帰的に定義されたkoch関数。画像を出力するプログラムで再帰を見ると、思わず「おっ、フラクタルゥー」となるのでよろしいかと。

( defn koch [ n len angle ] (if ( = 1 n ) ( forward len angle ) (let [ l ( / len ( + 2 ( / 2 ( Math/sqrt 2 )))) a ( * Math/PI 0.25 )] ( doall ( map #( koch ( dec n ) l %) [ angle ( - angle a ) ( + angle a ) angle ])))))

あとはまあ描くだけ。drawにはなるべく仕事をさせないようにすると、作った図形が再利用しやすい。

( defn draw [] ( q/translate 50 100 ) ( koch 4 100 0 )) ( defn setup [] ( q/background 255 )) ( q/defsketch example :setup setup :draw draw :size [ 200 200 ])

結果；