「プログラムでシダを描画する」を Purple で描画する

「プログラムでシダを描画する」をPythonで描画する の写経です。

上記ページに記載の再帰呼び出し版を、そのまま Purple で書いてみました。

コード

(import random)
(from-import PIL Image)

(val N 20)
(val xm 0)
(val ym 0.5)
(val h 0.6)

(val width 500)
(val height 500)

(val W1x |+ (* 0.836 _1) (* 0.044 _2)|)
(val W1y |+ (* -0.044 _1) (* 0.836 _2) 0.169|)
(val W2x |+ (* -0.141 _1) (* 0.302 _2)|)
(val W2y |+ (* 0.302 _1) (* 0.141 _2) 0.127|)
(val W3x |+ (* 0.141 _1) (* -0.302 _2)|)
(val W3y |+ (* 0.302 _1) (* 0.141 _2) 0.169|)
(val W4x (fn (x y) 0))
(val W4y (fn (x y) (* 0.175337 y)))

(def f (im k x y)
  (if (< 0 k)
    (do
      (f im (- k 1) (W1x x y) (W1y x y))
      (if (< (random.random) 0.3)
        (f im (- k 1) (W2x x y) (W2y x y)))
      (if (< (random.random) 0.3)
        (f im (- k 1) (W3x x y) (W3y x y)))
      (if (< (random.random) 0.3)
        (f im (- k 1) (W4x x y) (W4y x y))))
    (do
      (val s 490)
      (im.putpixel [(int (+ (* x s) (* width 0.5)))
                    (int (- height (* y s)))]
                   [0 128 0]))))

(val im (Image.new "RGB" [width height] [255 255 255]))
(f im N 0 0)
(im.show)

出力結果

f:id:i2y:20140530013552p:plain

人のネタをパクってばかりですみません。。