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