;;James Liao
;;this draws a fractal bubble patter

(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 (draw-circleP centerP radius)
  (draw-arcP centerP (addP centerP (mP radius 0)) 360 360))

(define (bubbles n) 
  (if (= 0 n) 'done
      (begin
        (draw-circleP my-centerP starting-radius)
        (bh my-centerP (/ starting-radius radius-scale-factor) (- n 1)))))

(define (bh centerP radius n)
  (if (= 0 n) 'done
      (let* ((distance (* radius distance-scale-factor))
             (topP (addP (mP (* distance (cos (/ *pi* 2))) (* distance (sin (/ *pi* 2)))) centerP))
             (lowleftP (addP (mP (* distance (cos (generate-theta 3 1))) (* distance (sin (generate-theta 3 1)))) centerP))
             (lowrightP (addP (mP (* distance (cos (generate-theta 3 2))) (* distance (sin (generate-theta 3 2)))) 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)))))