;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; NAME:        rotater-examples.scm
;;
;; DESCRIPTION: 3D Rotater Examples
;;
;; AUTHOR:      Dan Garcia, Ph.D.  -  University of California at Berkeley
;;              Copyright (C) Dan Garcia, 2001. All rights reserved.
;;
;; DATE:        2001-10-13
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; C-CURVE / DRAGON LAYERED FRACTALs
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;
;; c-curve/dragon3
;; Input: P1      [P3]      "Starting point"
;;        P2      [P3]      "Ending point"
;;        level   [int]     "Fractal level"
;;        color   [int]     "Color for this level"
;;        dragon? [boolean] "Dragon curve or C-curve?"
;; Side-Effect: Draw c-curve or dragon fractal at recursion level, color P1->P2
;;;;;;;;;;;;;

(define (c-curve/dragon3 P1 P2 level color dragon?)
  (if (= level 0)
      (draw-lineP3 P1 P2 color)
      (let ((Pm (coord3 P1 P2 *Pnegz_heaven* (mP3 -1/2 0 1/2))))
        (c-curve/dragon3 P1 Pm (- level 1) color dragon?)
        (if dragon?
            (c-curve/dragon3 P2 Pm (- level 1) color dragon?)
            (c-curve/dragon3 Pm P2 (- level 1) color dragon?)))))

;;;;;;;;;;;;;
;; write-c-curve/dragon-layers
;; Input: dragon? [boolean] "Dragon curve or C-curve?"
;; Side-Effect: Write layered dragon or c-curve to Rotater file
;;;;;;;;;;;;;

(define (write-c-curve/dragon-layers dragon?)
  (write-rotater 
    (if dragon? "LayeredDragon.rot" "LayeredCCurve.rot")
    ; my-draw-proc 
    (lambda (i)
      (for-each 
        (lambda (n)
          (let ((z-offset (* (/ 100 3) n)))
            (c-curve/dragon3 
              (addP3 *BW* (mP3 0 0 z-offset))
              (addP3 *BE* (mP3 0 0 z-offset))
              n (color-level n) dragon?)))
        '(0 1 2 3 4 5 6)))
    0
    (if dragon? "Layered Dragon Fractal" "Layered C-Curve Fractal")
    "2001-10-10"
    "Dan Garcia (ddgarcia@cs.berkeley.edu)"
    "http://www.cs.berkeley.edu/~ddgarcia/"))

;; Actually write the file!
;;

(write-c-curve/dragon-layers #f)
(write-c-curve/dragon-layers #t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; CIRCLES / CUBIESs
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;
;; draw-circlies-cubies
;; Input: Porigin [P3]  "point simulating origin"
;;        Pz      [P3]  "point simulating the point [0,0,1]"
;;        Pydir   [P3]  "point NOT collinear with (Porigin,Pz) in y-direction"
;;        n       [int] "Recursion level"
;;        sides   [int] "Samples of the circle for circlies"
;;        cubies? [boolean] "Cubies or circlies?"
;; Side-Effect: Draw embedded circlies or cubies 
;;;;;;;;;;;;;

(define (draw-circlies-cubies Porigin Pz Pydir n sides cubies?)
  (if cubies?
      (draw-cubeP3 Porigin Pz Pydir (color-level n))
      (draw-cube-arcP3 Porigin Pz Pydir sides (color-level n)))
  (if (= n 0)
      'done
      (let ((Pznew (coord3 Porigin Pz Pydir    (mV .5 .5 .5)))
            (Pydirnew (coord3 Porigin Pz Pydir (mV 0 1 1))))
        (draw-circlies-cubies Porigin Pznew Pydirnew (- n 1) sides cubies?))))

;;;;;;;;;;;;;
;; write-circlies-cubies
;; Input: sides   [int]     "Samples of the circle for circlies"
;;        dragon? [boolean] "Dragon curve or C-curve?"
;; Side-Effect: Write layered dragon or c-curve to Rotater file
;;;;;;;;;;;;;

(define (write-circlies-cubies sides cubies?)
  (write-rotater 
    (if cubies? "cubies.rot" "circlies.rot")
    (lambda (i)
      (draw-circlies-cubies (mP3 0 0 0)
                            (mP3 0 0 100)
                            (mP3 0 1 0)
                            i
                            sides
                            cubies?)
      )
    7
    (if cubies? "Embedded Cubies" "Embedded Circlies")
    "2001-10-13"
    "Dan Garcia (ddgarcia@cs.berkeley.edu)"
    "http://www.cs.berkeley.edu/~ddgarcia/"))

;; Actually write the file!
;;

(write-circlies-cubies 32 #t)
(write-circlies-cubies 32 #f)