2010年2月11日木曜日

cl-gdでお絵描き

Common LispでGD Graphics libraryを利用するためのライブラリ、cl-gdを使って遊んでみる。

asdf-installでインストールできるが、利用するためには cl-gdのディレクトリにあるcl-gd-glue.cからcl-gd-glue.soを作る必要がある。 Makefileがあるが、libiconvがいらないっぽいのでそこだけ修正してmakeする。

絵心はないので、図形を書いてみた。

以下はシェルピンスキーの三角形(?)を書くコード。

(defun draw-sierpinski-triangle (n size path)
(when (< n 1) (error "Required 'n >= 1'"))
(cl-gd:with-image* (size size)
;;background(white)
(cl-gd:allocate-color 255 255 255)
(let ((black (cl-gd:allocate-color 0 0 0))
(white (cl-gd:allocate-color 255 255 255)))
(draw-triangle (round size 2) 0 size black)
(when (> n 1)
(labels ((inner (n x y size)
(draw-triangle x (+ size y) (round size 2) black t)
(when (> n 2)
(let ((half (/ size 2)))
(inner (1- n) x y half)
(inner (1- n) (- x (round size 4)) (+ y half) half)
(inner (1- n) (+ x (round size 4)) (+ y half) half)))))
(inner n (/ size 2) 0 size))))
(cl-gd:write-image-to-file path :if-exists :supersede)))

(defun draw-triangle (x y size color &optional (reverse? nil))
(let ((half (round size 2))
(x (round x))
(y (round y))
(size (round size)))
(cl-gd:draw-polygon
(if reverse?
(list x y (- x half) (- y size) (+ x half) (- y size))
(list x y (- x half) (+ y size) (+ x half) (+ y size)))
:color color)))

;;(draw-sierpinski-triangle 5 300 "hoge.jpg")

0 件のコメント:

コメントを投稿