Dragon curve
27th September 2023
This recursive function plots a fractal curve known as the Dragon Curve [1]:
It's shown above running on the Lisp Badge LE.
Here's the program:
; ; Dragon Curve (defvar *x*) (defvar *y*) (defvar *th*) (defun forward (length) (let ((new-x (+ *x* (* length (cos *th*)))) (new-y (- *y* (* length (sin *th*))))) (draw-line *x* *y* new-x new-y) (setf *x* new-x) (setf *y* new-y))) (defun sin (th) (nth th '(0 1 0 -1))) (defun cos (th) (nth th '(1 0 -1 0))) (defun rotate (angle) (setf *th* (mod (+ *th* angle) 4))) (defun dragon (size level turn) (cond ((zerop level) (forward size)) (t (dragon size (1- level) 1) (rotate turn) (dragon size (1- level) -1)))) (defun go () (setq *x* 80) (setq *y* 50) (setq *th* 3) (write-byte 12) (princ "Dragon Curve") (dragon 3 10 1) (loop))
It uses Turtle Graphics [2], but since it only uses right angle turns it doesn't need floating point for the calculations, and so will run on any version of uLisp.
- ^ Dragon curve on Wikipedia.
- ^ Turtle graphics on Wikipedia.