diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/turtle-system.lisp | 60 |
1 files changed, 23 insertions, 37 deletions
diff --git a/src/turtle-system.lisp b/src/turtle-system.lisp index 6e4f7c2..b9b3510 100644 --- a/src/turtle-system.lisp +++ b/src/turtle-system.lisp @@ -9,77 +9,63 @@ (export '[) (export ']) -(defun turtle-system (fn list radians) +(defun turtle-system (fn list) (iter (with pos = (sb-cga:vec 0.0 0.0 0.0)) (with vec-x = (sb-cga:vec 1.0 0.0 0.0)) (with vec-y = (sb-cga:vec 0.0 1.0 0.0)) (with vec-z = (sb-cga:vec 0.0 0.0 1.0)) (with stack = '()) - (with angle = radians) (for item in list) (case (car item) ;;Move forward one unit,adding data to mesh. ((f) (let ((new-pos - (vec+ pos vec-y))) + (vec+ pos + (vec* vec-y + (cadr item))))) (appending (funcall fn pos new-pos vec-x vec-y vec-z)) (setf pos new-pos))) ;;Move forward one unit,without adding data to mesh. ((j) (setf pos (vec+ pos - vec-y))) + (vec* vec-y + (cadr item))))) ;;Rotate left on axis z ((+) - (setf vec-x - (vec-rotate-around vec-x vec-z angle)) - (setf vec-y - (vec-rotate-around vec-y vec-z angle))) + (setf vec-x (vec-rotate-around vec-x vec-z (cadr item)) + vec-y (vec-rotate-around vec-y vec-z (cadr item)))) ;;Rotate right on axis z ((-) - (setf vec-x - (vec-rotate-around vec-x vec-z (- angle))) - (setf vec-y - (vec-rotate-around vec-y vec-z (- angle)))) + (setf vec-x (vec-rotate-around vec-x vec-z (- (cadr item))) + vec-y (vec-rotate-around vec-y vec-z (- (cadr item))))) ;;Rotate left on axis y ((&) - (setf vec-x - (vec-rotate-around vec-x vec-y angle)) - (setf vec-z - (vec-rotate-around vec-z vec-y angle))) + (setf vec-x (vec-rotate-around vec-x vec-y (cadr item)) + vec-z (vec-rotate-around vec-z vec-y (cadr item)))) ;;Rotate right on axis y ((^) - (setf vec-x - (vec-rotate-around vec-x vec-y (- angle))) - (setf vec-z - (vec-rotate-around vec-z vec-y (- angle)))) + (setf vec-x (vec-rotate-around vec-x vec-y (- (cadr item))) + vec-z (vec-rotate-around vec-z vec-y (- (cadr item))))) ;;Rotate left on axis x ((q) - (setf vec-z - (vec-rotate-around vec-z vec-x angle)) - (setf vec-y - (vec-rotate-around vec-y vec-x angle))) + (setf vec-z (vec-rotate-around vec-z vec-x (cadr item)) + vec-y (vec-rotate-around vec-y vec-x (cadr item)))) ;;Rotate right on axis x ((/) - (setf vec-z - (vec-rotate-around vec-z vec-x (- angle))) - (setf vec-y - (vec-rotate-around vec-y vec-x (- angle)))) + (setf vec-z (vec-rotate-around vec-z vec-x (- (cadr item))) + vec-y (vec-rotate-around vec-y vec-x (- (cadr item))))) ;;Push the current turtle state onto a stack (([) (push (list pos vec-x vec-y vec-z) stack)) ;;Pop the turtle stack, restoring an earlier state ((]) - (let* ((asd (pop stack)) - (pos0 (pop asd)) - (vec-x0 (pop asd)) - (vec-y0 (pop asd)) - (vec-z0 (pop asd))) - (setf pos pos0 - vec-x vec-x0 - vec-y vec-y0 - vec-z vec-z0)))))) + (let* ((asd (pop stack))) + (setf pos (pop asd) + vec-x (pop asd) + vec-y (pop asd) + vec-z (pop asd))))))) ;;; Turgle utils |