;;James Liao
;;this draws a fractal bubble pattern and ANIMATES IT!

(load "graphics-lib.scm")

(define starting-radius (/ *R* 2))
(define radius-scale-factor 3)
(define distance-scale-factor 4)
(define my-centerP (mP 0 0))

(define (generate-theta number-of-shapes index)
  (+ (/ *pi* 2) (* index (/ (* *pi* 2) number-of-shapes))))

(define cos1 (cos (generate-theta 3 1)))
(define sin1 (sin (generate-theta 3 1)))
(define cos2 (cos (generate-theta 3 2)))
(define sin2 (sin (generate-theta 3 2)))


(define (draw-circleP centerP radius)
  (draw-arcP centerP (addP centerP (mP radius 0)) 360 360))

(define (bubbles n) 
  (begin
    (draw-circleP my-centerP starting-radius)
    (bh my-centerP (/ starting-radius radius-scale-factor) (- n 0))))

(define (bh centerP radius n)
  (if (< n 1)
      (let* ((distance (* n (* radius distance-scale-factor)))
             (radius-incr (* radius (- radius-scale-factor (* n (- radius-scale-factor 1)))))
             (topP      (addP (mP (* distance (cos (/ *pi* 2))) 
                                  (* distance (sin (/ *pi* 2)))) 
                              centerP))
             (lowleftP  (addP (mP (* distance cos1) (* distance sin1)) centerP))
             (lowrightP (addP (mP (* distance cos2) (* distance sin2)) centerP)))
        (draw-circleP topP radius-incr)
        (draw-circleP lowleftP radius-incr)
        (draw-circleP lowrightP radius-incr)
        (draw-circleP centerP radius-incr))
      
      (let* ((distance (* radius distance-scale-factor))
             (topP      (addP (mP (* distance (cos (/ *pi* 2))) 
                                  (* distance (sin (/ *pi* 2)))) 
                              centerP))
             (lowleftP  (addP (mP (* distance cos1) (* distance sin1)) centerP))
             (lowrightP (addP (mP (* distance cos2) (* distance sin2)) centerP)))
        (draw-circleP topP radius)
        (draw-circleP lowleftP radius)
        (draw-circleP lowrightP radius)
        (draw-circleP centerP radius)
        (bh centerP (/ radius radius-scale-factor) (- n 1))
        (bh topP (/ radius radius-scale-factor) (- n 1))
        (bh lowleftP (/ radius radius-scale-factor) (- n 1))
        (bh lowrightP (/ radius radius-scale-factor) (- n 1)))
      
      ))

(define (bubbles-anim step)
  (animate-fractal
    (lambda (i) 
      (bubbles i))
    step 4))

(bubbles-anim 1/10)