;; 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))