;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; NAME:        sierpinski-square-alt-anim.scm
;;
;; DESCRIPTION: An example of the sierpinski square fractal animated.
;;              Evaluate the entire file.
;;
;; AUTHOR:      Dan Garcia  -  University of California at Berkeley
;;              Copyright (C) Dan Garcia, 2001. All rights reserved.
;;
;; DATE:        2001-09-21
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; In stk, we need to define all the fractions we use in dr. scheme/macgambit

(if *stk* 
    (begin
      (eval '(define  1/4  (/  1 4 )))
      (eval '(define  1/3  (/  1 3 )))
      (eval '(define  2/3  (/  2 3 )))
      (eval '(define -1/3  (/ -1 3 )))
      (eval '(define  1/20 (/  1 20)))
      (eval '(define  1/10 (/  1 10)))))

;;;;;;;;;;;;;;;;;;;
;; sierpinski-square-alt-anim
;;
;;       Input: C [P] "Center"
;;              r [float] "radius of square"
;;              n [float] "recursion iteration level"
;; Side-Effect: Draw the sierpinski-square centered at C with radius r
;;              at "n" recursion depth
;;;;;;;;;;;;;;;;;;;

(define (sierpinski-square-alt-anim C r n)
  (define (ss-alt-helper P1 P2 level)
    (if (< level 1)
        
        ;; Animate based on fraction above level
        (let* ((t      (- level (truncate level)))
               (P1m  (coord P1 P2 (mP 0 1/3)))
               (P2m  (coord P1 P2 (mP 0 2/3)))
               (P1mt (coord P1 P2 (mP (* t -1/3) 1/3)))
               (P2mt (coord P1 P2 (mP (* t -1/3) 2/3))))
          (draw-poly-lineP P1 P1m P1mt P2mt P2m P2))
        
        ;; Just do recursive call
        (let ((P1m (coord P1 P2 (mP 0 1/3)))
              (P2m  (coord P1 P2 (mP 0 2/3)))
              (P1mu (coord P1 P2 (mP -1/3 1/3)))
              (P2mu (coord P1 P2 (mP -1/3 2/3))))
          (ss-alt-helper P1   P1m  (- level 1))
          (ss-alt-helper P1m  P1mu (- level 1))
          (ss-alt-helper P1mu P2mu (- level 1))
          (ss-alt-helper P2mu P2m  (- level 1))
          (ss-alt-helper P2m  P2   (- level 1)))))
  
  (let ((SW (addP C (mP (- r) (- r))))
        (SE (addP C (mP    r  (- r))))
        (NE (addP C (mP    r     r )))
        (NW (addP C (mP (- r)    r ))))
    (ss-alt-helper SW SE n)
    (ss-alt-helper SE NE n)
    (ss-alt-helper NE NW n)
    (ss-alt-helper NW SW n)))

;;;;;;;;;;;;;;;;;;;
;; demo-sierpinski-square-alt-anim
;;
;;       Input: dragon? [bool] #t = dragon, #f = c-curve
;;            :    step [float] how much to advance fractal each step
;;            : filename [string] In stk, filename to save. If "", just display.
;;            : max-level [float] The max recursion level
;; Side-Effect: Animate c-curve/dragon through 'step' steps
;;;;;;;;;;;;;;;;;;;

(define (demo-sierpinski-square-alt-anim step max-level filename animate?)
  (grow-fractal
    (lambda (i) 
      (sierpinski-square-alt-anim *C* (- *Radius* 1) i))
    step max-level filename animate?))

;(demo-sierpinski-square-alt-anim 1/10 4.09 "ssa" #t)  ;; write to file
;(demo-sierpinski-square-alt-anim 1/4  4    ""    #f)  ;; just step
 (demo-sierpinski-square-alt-anim 1/10 4.09 ""    #t)  ;; just animate