examples/vase.ss
#lang scheme
(require vscheme/autocad)

;(draw (vase (xyz 0 0 0) 2 6))
(define (vase p d h)
  (define d/2 (/ d 2))
  (define cs (map (lambda (x n)
                    (make-region (make-circle (+z p (* d/2 n))
                                              (* d x))))
                  '(1/3 1 1/3 2/3)
                  '(  1 2   3   4)))
  ;; (do-loft objects ang1 mag1 ang2 mag2)
  (do-loft cs 0 0 0 0))

;(draw (vase2 (xyz 0 0 0) 2 6 0.4))
(define (vase2 p d h r)
  (define (make-circles d z r)
    (map (lambda (x n)
           (do-subtract (make-region (make-circle (+z p (* (/ z 2) n)) (* (/ d 2) x)))
                        (make-region (make-circle (+z p (* (/ z 2) n)) (* (/ d 2) x r)))))
         '(1/3 1 1/3 2/3)
         '(  1 2   3   4)))
  (define cs (make-circles d d r))
  (define cs2 (make-circles (* d 3/4) d r))
  (unite (do-subtract (do-loft cs 0 0 0 0)
                      (do-loft cs2 0 0 0 0))
         ;; tapa o vaso em baixo
         (make-cylinder (+z p (/ d 2)) (+z p (* d (+ 1/2 1/10))) (* d 3/4 1/3)))) ;(* d 1/2 1/3) (* (/ d 2) r 1/10))))

;; (time (draw (vase2 origin 6 10 2/3)))
;; (subtract (make-circle origin 5)
;;           (make-circle origin 3))

;(require "../backends/autocad/com-utils.ss")
;(let ((c1 (make-circle origin 3))
;      (c2 (make-circle origin 5)))
;  (invoke Boolean (first (draw c2)) 2 (first (draw c1))))