55 lines
1.8 KiB
Text
55 lines
1.8 KiB
Text
(defun abs-sq (z)
|
|
(+ (expt (realpart z) 2)
|
|
(expt (imagpart z) 2)))
|
|
|
|
(defun round-decimal (x places)
|
|
(/ (floor (* x (expt 10 places)) 1)
|
|
(expt 10 places)))
|
|
|
|
(defun round-complex (z places)
|
|
(complex (round-decimal (realpart z) places)
|
|
(round-decimal (imagpart z) places)))
|
|
|
|
(defun mandel-point-r (z c limit)
|
|
(declare (xargs :measure (nfix limit)))
|
|
(cond ((zp limit) 0)
|
|
((> (abs-sq z) 4) limit)
|
|
(t (mandel-point-r (+ (round-complex (* z z) 15) c)
|
|
c
|
|
(1- limit)))))
|
|
|
|
(defun mandel-point (z iters)
|
|
(- 5 (floor (mandel-point-r z z iters) (/ iters 5))))
|
|
|
|
(defun draw-mandel-row (im re cols width iters)
|
|
(declare (xargs :measure (nfix cols)))
|
|
(if (zp cols)
|
|
nil
|
|
(prog2$ (cw (coerce
|
|
(list
|
|
(case (mandel-point (complex re im)
|
|
iters)
|
|
(5 #\#)
|
|
(4 #\*)
|
|
(3 #\.)
|
|
(2 #\.)
|
|
(otherwise #\Space))) 'string))
|
|
(draw-mandel-row im
|
|
(+ re (/ (/ width 3)))
|
|
(1- cols)
|
|
width iters))))
|
|
|
|
(defun draw-mandel (im rows width height iters)
|
|
(if (zp rows)
|
|
nil
|
|
(progn$ (draw-mandel-row im -2 width width iters)
|
|
(cw "~%")
|
|
(draw-mandel (- im (/ (/ height 2)))
|
|
(1- rows)
|
|
width
|
|
height
|
|
iters))))
|
|
|
|
(defun draw-mandelbrot (width iters)
|
|
(let ((height (floor (* 1000 width) 3333)))
|
|
(draw-mandel 1 height width height iters)))
|