; ; Turtle Graphics ; from Lisp in Small Parts, http://lisp.plasticki.com/ ; Licensed under CC0 1.0: http://creativecommons.org/publicdomain/zero/1.0/ ; 30/6/2012 ; (defparameter turtle-pane nil) (defparameter turtle-x 320) (defparameter turtle-y 240) (defparameter turtle-theta 0) (defparameter turtle-draw t) (defun reset () (setf turtle-x 240) (setf turtle-y 180) (setf turtle-theta 0) (setf turtle-draw t)) (defun forward (length) (let ((new-x (+ turtle-x (* length (cos turtle-theta)))) (new-y (- turtle-y (* length (sin turtle-theta))))) (if turtle-draw (gp:draw-line turtle-pane turtle-x turtle-y new-x new-y)) (setf turtle-x new-x) (setf turtle-y new-y))) (defun radians (angle) (* pi (/ angle 180))) (defun right (angle) (setf turtle-theta (- turtle-theta (radians angle)))) (defun back (length) (forward (- length))) (defun left (angle) (right (- angle))) (defun penup () (setf turtle-draw nil)) (defun pendown () (setf turtle-draw t)) (defun plot () (capi:contain (make-instance 'capi:output-pane :display-callback 'draw) :best-width 480 :best-height 360)) (defun inspi (side angle inc count) (forward side) (right angle) (if (> count 0) (inspi side (+ angle inc) inc (- count 1)))) (defun ldragon (size level) (if (= level 0) (forward size) (progn (ldragon size (- level 1)) (left 90) (rdragon size (- level 1))))) (defun rdragon (size level) (if (= level 0) (forward size) (progn (ldragon size (- level 1)) (right 90) (rdragon size (- level 1))))) (defun draw (pane &optional x y width height) (declare (ignore x y width height)) (setf turtle-pane pane) (reset) (ldragon 4 11))