2008/08/02

ブレゼンハム法

いわたさんよりコメントをいただいたので、やってみた。

参考サイト http://dencha.ojaru.jp/programs_07/pg_graphic_09a1.htmlありがとうございます。

(defparameter *r* 39 "半径")
(defparameter *points*
(append
(let* ((r *r*)
(x 0)
(y r)
(d (- 2 (* 2 r))))
(append
`((0 ,r) (0 ,(- 0 r)) (,r 0) (,(- 0 r) 0)) ;開始点
(loop
if (> d (- 0 y))
do (decf y)
and do (incf d (- 1 (* 2 y)))
if (<= d x)
do (incf x)
and do (incf d (1+ (* 2 x)))
until (zerop y)
collect (list x y) ; 0〜90度
collect (list (* x -1) y) ; 90〜180度
collect (list (* x -1) (* y -1)) ; 180〜270度
collect (list x (* y -1))))))) ; 270〜360度

(loop with map = (make-hash-table)
with keys = nil
for (x y) in *points*
do (push x (gethash y map))
do (pushnew y keys)
finally (loop for y in (sort keys #'<)
do (loop for x in (gethash y map)
with s = (make-string (1+ (* *r* 2))
:initial-element #\space)
do (setf (char s (+ x *r*)) #\X)
finally (write-line s))))

0 件のコメント: