;; Impromptu turtle graphics examples ;; Load and evaluate the turtle-graphics.scm library first ;; Read the comments in that library file for details of the syntax of this implementation ;; ;; These examples are largely based on those in ;; David Thornburg's "Discovering Apple Logo" 1983. ;; ;; Note that the colon prior to variable names is a convention from Logo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; simple commands, evaluate each line/function in turn ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (tg:forward 100) (tg:right 90) (tg:forward 50) (tg:home) (tg:clear-screen) (tg:back 40) (tg:pen-up) (tg:forward 90) (tg:pen-down) (tg:forward 50) (tg:clean) (tg:forward 30) (tg:clear-screen) ;;;;;;;;;;;;;;;; ;; functions ;;;;;;;;;;;;;;;; (tg:repeat 4 (tg:forward 80) (tg:right 90)) (tg:clear-screen) (tg:to (square :size) (tg:repeat 4 (tg:forward :size) (tg:right 90))) (square 80) (square 120) (tg:clear-screen) (tg:repeat 6 (square 100) (tg:right 60)) (tg:clear-screen) (tg:to (poly :size :sides) (tg:repeat :sides (tg:forward :size) (tg:right (/ 360 :sides)))) (poly 50 3) (poly 50 4) (poly 50 5) (poly 50 9) (tg:clear-screen) (tg:repeat 9 (tg:repeat 7 (tg:forward 200) (tg:right 114))) (tg:clear-screen) (tg:repeat 5 (tg:forward 100) (tg:repeat 5 (poly 40 3) (tg:right 72)) (tg:right 72)) (tg:clear-screen) (tg:to (star) (tg:repeat 5 (tg:forward 20) (tg:right 144))) (star) (tg:clear-screen) (tg:to (stars) (tg:repeat 8 (tg:set-pc (random) (random) (random) 1) (star) (tg:pen-up) (tg:set-x 30) (tg:pen-down))) (stars) (tg:clear-screen) (tg:to (more-stars) (tg:repeat 8 (stars) (tg:pen-up) (tg:set-y 30) (tg:set-x -240) (tg:pen-down))) (more-stars) (tg:clear-screen) (tg:pen-down) (tg:set-pc 1 0 0 1) ; red (tg:to (squiral :angle) (tg:make :side 0) (tg:repeat 100 (tg:forward :side) (tg:right :angle) (set! :side (+ :side 2)))) (squiral 90) (tg:clear-screen) (squiral 70) (tg:clear-screen) (squiral 118) (tg:clear-screen) (squiral 144) (tg:set-bg 0.3 0.3 0.3 1) ; gray (tg:clear-screen) (tg:set-pc 0 1 0.3 1) ; green (tg:to (closed-spiral size angle increment) (tg:repeat 720 (tg:forward size) (tg:right angle) (set! angle (+ angle increment)))) (closed-spiral 7 0 1) (tg:clear-screen) (closed-spiral 7 0 7) (tg:clear-screen) (closed-spiral 15 1 8) ;;;;;;;;;;;;;;;;;;;; ;; recursion ;;;;;;;;;;;;;;;;;;;; (tg:set-bg 0 0 0 1) ; black (tg:clear-screen) (tg:set-pc 0 0 1 1) ; blue (tg:to (quad-fractal :size :limit) (if (< :size :limit) (tg:forward :size) (begin (quad-fractal (/ :size 3) :limit) (tg:left 90) (quad-fractal (/ :size 3) :limit) (tg:right 90) (quad-fractal (/ :size 3) :limit) (tg:right 90) (quad-fractal (/ :size 3) :limit) (tg:left 90) (quad-fractal (/ :size 3) :limit)))) (tg:clear-screen) (tg:right 90) (quad-fractal 243 243) (tg:clear-screen) (tg:right 90) (quad-fractal 243 81) (tg:clear-screen) (tg:right 90) (quad-fractal 243 27) (tg:clear-screen) (tg:right 90) (quad-fractal 243 3) (tg:set-bg 1 1 1 1) ; white (tg:clear-screen) (tg:set-pc 0 1 0 1) ; green (tg:to (f-tree :size :counter) (if (= :counter 0) 'done (begin (tg:left 30) (tg:forward (* :size 2)) (f-tree :size (- :counter 1)) (tg:back (* :size 2)) (tg:right 60) (tg:forward :size) (f-tree :size (- :counter 1)) (tg:back :size) (tg:left 30)))) (tg:clear-screen) (f-tree 30 5) (tg:back 100) ;;;;;;;;;;;;;;;;;;;;;;;; ;; psudo 3D ;;;;;;;;;;;;;;;;;;;;;;;; (tg:set-bg 0.9 0.9 0.9 1) ; light gray (tg:clear-screen) (tg:set-pc 0 0 0 1) ; black (tg:to (escher-box :size :slist) (tg:left 60) (tg:pen-down) (tg:repeat 3 (shade :size (tg:first :slist)) (set! :slist (tg:but-first :slist)) (tg:right 120)) (tg:right 60) (hexagon :size)) (tg:to (hexagon :size) (tg:pen-up) (tg:left 60) (tg:forward :size) (tg:pen-down) (tg:right 120) (tg:repeat 6 (tg:forward :size) (tg:right 60)) (tg:left 120) (tg:pen-up) (tg:back :size) (tg:right 60) (tg:pen-down)) (tg:to (shade :size :stripes) (tg:make dist (/ :size :stripes)) (tg:repeat :stripes (tg:forward dist) (tg:right 120) (tg:forward :size) (tg:back :size) (tg:left 120)) (tg:back :size)) (tg:clear-screen) (escher-box 100 (list 3 5 12))