;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; NAME:        ccurve-dragon-anim.scm
;;
;; DESCRIPTION: An example of the ccurve-dragon 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/2  (/  1 2 )))
      (eval '(define -1/2  (/ -1 2 )))
      (eval '(define  1/20 (/  1 20)))
      (eval '(define  1/10 (/  1 10)))))

;;;;;;;;;;;;;;;;;;;
;; c-curve/dragon-anim
;;
;;       Input: P1 [P] "Locked Starting point"
;;              P2 [P] "Locked Ending point"
;;              level [float] "recursion iteration level"
;;              dragon? [bool] #t = dragon, #f = c-curve
;; Side-Effect: Draw the c-curve/dragon from P1 to P2
;;              at "level" recursion depth
;;;;;;;;;;;;;;;;;;;

(define (c-curve/dragon-anim P1 P2 level dragon?)
  (if (< level 1)
      
      ;; Animate based on fraction above level
      (let* ((Pm (coord P1 P2 (mP -1/2 1/2)))
             (P12 (avgP P1 P2))
             (Pt (lin-interpP P12 Pm (- level (truncate level)))))
        (draw-lineP P1 Pt)
        (draw-lineP Pt P2))
      
      ;; Just do recursive call
      (let ((Pm (coord P1 P2 (mP -1/2 1/2))))
           (c-curve/dragon-anim P1 Pm (- level 1) dragon?)
           (if dragon?
               (c-curve/dragon-anim P2 Pm (- level 1) dragon?)
               (c-curve/dragon-anim Pm P2 (- level 1) dragon?)))))

;;;;;;;;;;;;;;;;;;;
;; demo-c-curve/dragon-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-c-curve/dragon-anim step max-level dragon? filename animate?)
  (grow-fractal
    (lambda (i) 
      (c-curve/dragon-anim (mP (/ *L* 2) (/ *D* 4)) 
                           (mP (/ *R* 2) (/ *D* 4)) i dragon?))
    step max-level filename animate?))

;(demo-c-curve/dragon-anim 1/4  13    #t       "" #f)  ;; just step
;(demo-c-curve/dragon-anim 1/10 13.04 #t "dragon" #t)  ;; write to file
 (demo-c-curve/dragon-anim 1/10 13.04 #t       "" #t)  ;; just animate