56 lines
1.6 KiB
Common Lisp
56 lines
1.6 KiB
Common Lisp
; === Graphical Julia set display in Emacs =====================
|
|
|
|
(setq julia-size (cons 300 200))
|
|
(setq xmin -1.5)
|
|
(setq xmax 1.5)
|
|
(setq ymin -1)
|
|
(setq ymax 1)
|
|
(setq julia0 (cons -0.512511498387847167 0.521295573094847167))
|
|
(setq max-iter 100)
|
|
|
|
(defun julia-iter-point (x y)
|
|
"Run the actual iteration for each point."
|
|
(let ((xp x)
|
|
(yp y)
|
|
(it 0)
|
|
(xt 0))
|
|
(while (and (< (+ (* xp xp) (* yp yp)) 4) (< it max-iter))
|
|
(setq xt (+ (* xp xp) (* -1 yp yp) (car julia0)))
|
|
(setq yp (+ (* 2 xp yp) (cdr julia0)))
|
|
(setq xp xt)
|
|
(setq it (1+ it)))
|
|
it))
|
|
|
|
(defun julia-iter (p)
|
|
"Return string for point based on whether inside/outside the set."
|
|
(let ((it (julia-iter-point (car p) (cdr p))))
|
|
(if (= it max-iter) "*" (if (cl-oddp it) "+" "-"))))
|
|
|
|
(defun julia-pos (x y)
|
|
"Convert screen coordinates to input coordinates."
|
|
(let ((xp (+ xmin (* (- xmax xmin) (/ (float x) (car julia-size)))))
|
|
(yp (+ ymin (* (- ymax ymin) (/ (float y) (cdr julia-size))))))
|
|
(cons xp yp)))
|
|
|
|
(defun string-to-image (str)
|
|
"Convert image data string to XPM image with three colors."
|
|
(create-image (concat (format "/* XPM */
|
|
static char * julia[] = {
|
|
\"%i %i 3 1\",
|
|
\"+ c #ff0000\",
|
|
\"- c #0000ff\",
|
|
\"* c #000000\"," (car julia-size) (cdr julia-size))
|
|
str "};") 'xpm t))
|
|
|
|
(defun julia-pic ()
|
|
"Plot the Julia set in color."
|
|
(setq all "")
|
|
(dotimes (y (cdr julia-size))
|
|
(setq line "")
|
|
(dotimes (x (car julia-size))
|
|
(setq line (concat line (julia-iter (julia-pos x y)))))
|
|
(setq all (concat all "\"" line "\",\n")))
|
|
(insert-image (string-to-image all)))
|
|
|
|
(julia-pic)
|