#lang racket
(require gigls/unsafe)


(define canvas (image-new 200 200))

(define background
  (lambda (n)
    (let ((width (image-width canvas))
          (height (image-height canvas)))
      (image-show (image-compute
                   (lambda (col row)
                     (rgb-new
                      ;red component
                      (- (- 255 (* (/ 255 1000) n)) (/ (* (+ (/ col 2) (/ row 2)) 165) width))
                      ;green component
                      (+ 42 (/ (* (+ (/ col 2) (/ row 2)) 42) width))
                      ;blue component
                      (- 42 (/ (* (+ (/ col 2) (/ row 2)) 42) width)))) width height)
                  ))))

(define master-procedure
  (lambda (width height n)
    (let* (
           (background
            (image-compute
             (lambda (col row)
               (rgb-new
                ;red component
                (- (- 255 (* (/ 255 1000) n)) (/ (* (+ (/ col 2) (/ row 2)) 165) width))
                ;green component
                (+ 42 (/ (* (+ (/ col 2) (/ row 2)) 42) width))
                ;blue component
                (- 42 (/ (* (+ (/ col 2) (/ row 2)) 42) width))))
             width height)
            )
           
           (distance
            (lambda (width height)
              (/
               (/
                (sqrt
                 (+
                  (expt height 2)
                  (expt width 2)))
                50)
               5)))
           
           (yleft
            (lambda (turtle)
              (turtle-forward! turtle (distance width height))
              (turtle-turn! turtle 30)
              (turtle-forward! (turtle-clone turtle) (distance width height))
              (turtle-turn! turtle -60)
              (turtle-forward! turtle (distance width height))))
           
           (yright
            (lambda (turtle)
              (turtle-forward! turtle (distance width height))
              (turtle-turn! turtle -30)
              (turtle-forward! (turtle-clone turtle) (distance width height))
              (turtle-turn! turtle 60)
              (turtle-forward! turtle (distance width height))))     
           
           (vinething2
            (lambda (turtle)
              (yleft turtle)
              (yleft turtle)
              (yright turtle)))
           
           (vinething3
            (lambda (turtle)
              (yright turtle)
              (yright turtle)
              (yleft turtle)))    
           
           (ultimatevinething
            (lambda (turtle)
              (vinething2 turtle)
              (vinething3 turtle)))
           
           (trueultimatevinething
            (lambda (turtle n)
              (repeat (ceiling (/ n 50)) ultimatevinething turtle)))
           
           (turtle1 (turtle-new background))
           (turtle2 (turtle-new background))
           (turtle3 (turtle-new background))
           (turtle4 (turtle-new background))
           (turtle5 (turtle-new background))
           (turtle6 (turtle-new background))
           (turtle7 (turtle-new background))
           (turtle8 (turtle-new background))
           (turtle9 (turtle-new background))
           (turtle10 (turtle-new background))
           (turtle11 (turtle-new background))
           (turtle12 (turtle-new background))
           (turtle13 (turtle-new background))
           (turtle14 (turtle-new background))
           (turtle-starter
            (lambda (width height n)
              (cond
                [(<= 0 n 100)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 n)]
                [(<= 100 n 200)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 n)
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 n)
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 n)]
                [(<= 200 n 300)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 n)
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 n)
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 n)
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 n)
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 n)]
                [(<= 300 n 400)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 n)
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 n)
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 n)
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 n)
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 n)
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 n)
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 n)
                 (turtle-teleport! turtle11 (* width .05) (* height .9))
                 (turtle-face! turtle11 88)
                 (trueultimatevinething turtle11 n)
                 ]
                [(<= 400 n 500)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 n)
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 n)
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 n)
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 n)
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 n)
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 n)
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 n)
                 (turtle-teleport! turtle11 (* width .05) (* height .9))
                 (turtle-face! turtle11 -89)
                 (trueultimatevinething turtle11 n)
                 (turtle-teleport! turtle12 (* width 1) (* height 0))
                 (turtle-face! turtle12 185)
                 (trueultimatevinething turtle12 n)
                 (turtle-teleport! turtle13 (* width .3) (* height .75))
                 (turtle-face! turtle13 -98)
                 (trueultimatevinething turtle13 n)
                 (turtle-teleport! turtle14 (* width .8) (* height .2))
                 (turtle-face! turtle14 -175)
                 (trueultimatevinething turtle14 n)
                 ]
                [(<= 500 n 600)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 (- n 50))
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 (- n 50))
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 (- n 100))
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 (- n 150))
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 (- n 150))
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 (- n 200))
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 (- n 250))
                 ]
                
                [(<= 600 n 700)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 (- n 50))
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 (- n 50))
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 (- n 100))
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 (- n 150))
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 (- n 150))
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 (- n 200))
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 (- n 250))
                 (turtle-teleport! turtle11 (* width .05) (* height .9))
                 (turtle-face! turtle11 -75)
                 (trueultimatevinething turtle11 (- n 300))
                 ]
                [(<= 700 n 800)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 (- n 50))
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 (- n 50))
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 (- n 100))
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 (- n 150))
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 (- n 150))
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 (- n 200))
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 (- n 250))
                 (turtle-teleport! turtle11 (* width .05) (* height .9))
                 (turtle-face! turtle11 -75)
                 (trueultimatevinething turtle11 (- n 300))
                 (turtle-teleport! turtle12 (* width 1) (* height 0))
                 (turtle-face! turtle12 185)
                 (trueultimatevinething turtle12 (- n 350))
                 ]
                [(<= 800 n 900)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 (- n 50))
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 (- n 50))
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 (- n 100))
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 (- n 150))
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 (- n 150))
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 (- n 200))
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 (- n 250))
                 (turtle-teleport! turtle11 (* width .05) (* height .9))
                 (turtle-face! turtle11 -75)
                 (trueultimatevinething turtle11 (- n 300))
                 (turtle-teleport! turtle12 (* width 1) (* height 0))
                 (turtle-face! turtle12 185)
                 (trueultimatevinething turtle12 (- n 350))
                 (turtle-teleport! turtle13 (* width .3) (* height .85))
                 (turtle-face! turtle13 -90)
                 (trueultimatevinething turtle13 (- n 400))
                 ]
                [(<= 900 n 1000)
                 (turtle-teleport! turtle1 (* width 1) (* height 1))
                 (turtle-face! turtle1 -135)
                 (trueultimatevinething turtle1 n)
                 (turtle-teleport! turtle2 (* width .25) (* height 1))
                 (turtle-face! turtle2 -100)
                 (trueultimatevinething turtle2 n)
                 (turtle-teleport! turtle3 (* width 1) (* height .6))
                 (turtle-face! turtle3 170)
                 (trueultimatevinething turtle3 n)
                 (turtle-teleport! turtle8 (* width .65) (* height .9))
                 (turtle-face! turtle8 -88)
                 (trueultimatevinething turtle8 (- n 50))
                 (turtle-teleport! turtle4 (* width .6) (* height .725))
                 (turtle-face! turtle4 -120)
                 (trueultimatevinething turtle4 (- n 50))
                 (turtle-teleport! turtle5 (* width .825) (* height .625))
                 (turtle-face! turtle5 -150)
                 (trueultimatevinething turtle5 (- n 100))
                 (turtle-teleport! turtle6 (* width .125) (* height .6))
                 (turtle-face! turtle6 -88)
                 (trueultimatevinething turtle6 (- n 150))
                 (turtle-teleport! turtle7 (* width .6) (* height .125))
                 (turtle-face! turtle7 -180)
                 (trueultimatevinething turtle7 (- n 150))
                 (turtle-teleport! turtle9 (* width .9) (* height .8))
                 (turtle-face! turtle9 -91)
                 (trueultimatevinething turtle9 (- n 200))
                 (turtle-teleport! turtle10 (* width 1) (* height .25))
                 (turtle-face! turtle10 179)
                 (trueultimatevinething turtle10 (- n 250))
                 (turtle-teleport! turtle11 (* width .05) (* height .9))
                 (turtle-face! turtle11 -75)
                 (trueultimatevinething turtle11 (- n 300))
                 (turtle-teleport! turtle12 (* width 1) (* height 0))
                 (turtle-face! turtle12 185)
                 (trueultimatevinething turtle12 (- n 350))
                 (turtle-teleport! turtle13 (* width .3) (* height .85))
                 (turtle-face! turtle13 -90)
                 (trueultimatevinething turtle13 (- n 400))
                 (turtle-teleport! turtle14 (* width .8) (* height .2))
                 (turtle-face! turtle14 -175)
                 (trueultimatevinething turtle14 (- n 450))
                 ]
                [else
                 null])))
           [d (min width height)]
           [cog1
            (lambda (image width height)
              (image-select-polygon! image ADD
                                     (position-new (ceiling (* .2 d)) (ceiling (* .05 d)))
                                     (position-new (ceiling (* .3 d)) (ceiling (* .05 d)))
                                     (position-new (ceiling (* .3 d)) (ceiling (* .45 d)))
                                     (position-new (ceiling (* .2 d)) (ceiling (* .45 d))))
              (image-fill! image)
              (image-select-nothing! image)
              image)]
           [cog2
            (lambda (image width height)
              (image-select-polygon! image ADD
                                     (position-new (ceiling (* 0 d)) (ceiling (* .05 d)))
                                     (position-new (ceiling (* .1 d)) (ceiling (* .05 d)))
                                     (position-new (ceiling (* .5 d)) (ceiling (* .45 d)))
                                     (position-new (ceiling (* .4 d)) (ceiling (* .45 d))))
              (image-fill! image)
              (image-select-nothing! image)
              image)]
           [cog3
            (lambda (image width height)
              (image-select-polygon! image ADD
                                     (position-new (ceiling (* .5 d)) (ceiling (* .05 d)))
                                     (position-new (ceiling (* .4 d)) (ceiling (* .05 d)))
                                     (position-new (ceiling (* 0 d)) (ceiling (* .45 d)))
                                     (position-new (ceiling (* .1 d)) (ceiling (* .45 d))))
              (image-fill! image)
              (image-select-nothing! image)
              image)])   
      (turtle-set-color! turtle1 "darkgreen")
      (turtle-set-color! turtle2 "darkgreen")
      (turtle-set-color! turtle3 "darkgreen")
      (turtle-set-color! turtle4 "darkgreen")
      (turtle-set-color! turtle5 "darkgreen")
      (turtle-set-color! turtle6 "darkgreen")
      (turtle-set-color! turtle7 "darkgreen")
      (turtle-set-color! turtle8 "darkgreen")
      (turtle-set-color! turtle9 "darkgreen")
      (turtle-set-color! turtle10 "darkgreen")
      (turtle-set-color! turtle11 "darkgreen")
      (turtle-set-color! turtle12 "darkgreen")
      (turtle-set-color! turtle13 "darkgreen")
      (turtle-set-color! turtle14 "darkgreen")
      (image-show background)
      (context-set-fgcolor! (rgb-new (+ 0 (floor (* n .125))) (+ 0 (floor (* n .125))) (+ 0 (floor (* n .125)))))
      (cog1 background width height)
      (cog2 background width height)
      (cog3 background width height)
      (turtle-starter width height n))))

(define mastercogs
  (lambda (width height n)
    (let* ([canvasabc (image-show (image-new width height))]
           [d (min width height)]
           [cog1
            (lambda (image width height)
              (image-select-polygon! image ADD
                                     (position-new (* .2 d) (* .05 d))
                                     (position-new (* .3 d) (* .05 d))
                                     (position-new (* .3 d) (* .45 d))
                                     (position-new (* .2 d) (* .45 d)))
              (image-fill! image)
              (image-select-nothing! image)
              image)]
           [cog2
            (lambda (image width height)
              (image-select-polygon! image ADD
                                     (position-new (* 0 d) (* .05 d))
                                     (position-new (* .1 d) (* .05 d))
                                     (position-new (* .5 d) (* .45 d))
                                     (position-new (* .4 d) (* .45 d)))
              (image-fill! image)
              (image-select-nothing! image)
              image)]
           [cog3
            (lambda (image width height)
              (image-select-polygon! image ADD
                                     (position-new (* .5 d) (* .05 d))
                                     (position-new (* .4 d) (* .05 d))
                                     (position-new (* 0 d) (* .45 d))
                                     (position-new (* .1 d) (* .45 d)))
              (image-fill! image)
              (image-select-nothing! image)
              image)])
      (context-set-fgcolor! (rgb-new (+ 0 (floor (* n .125))) (+ 0 (floor (* n .125))) (+ 0 (floor (* n .125)))))
      (cog1 canvasabc width height)
      (cog2 canvasabc width height)
      (cog3 canvasabc width height))))