(load "ub2-6.scm") ;;; SIGNATUR ;;; circle-bounding-box: circle -> rectangle ;;; ERKLÄRUNG ;;; (circle-bounding-box c) liefert die Bounding-Box des Kreises c zurück. ;;; BEISPIEL ;;; (circle-bounding-box (make-circle (make-posn 0 0) 1)) ;;; => (make-rectangle (make-posn -1 -1) (make-posn 2 2)) ;;; DEFINITION (define circle-bounding-box (lambda (c) (let ((x (posn-x (circle-origin c))) (y (posn-y (circle-origin c))) (r (circle-radius c))) (make-rectangle (make-posn (- x r) (- y r)) (make-posn (* 2 r) (* 2 r)))))) ;;; SIGNATUR ;;; rectangle-bounding-box: rectangle -> rectangle ;;; ERKLÄRUNG ;;; (rectangle-bounding-box r) liefert die Bounding-Box von r zurück. ;;; BEISPIEL ;;; (rectangle-bounding-box (make-rectangle (make-posn 0 0) (make-posn 2 3))) ;;; => (make-rectangle (make-posn 0 0) (make-posn 2 3)) ;;; DEFINITION (define rectangle-bounding-box (lambda (r) (rectangle-move r (make-posn 0 0)))) ;;; SIGNATUR ;;; triangle-bounding-box: triangle -> rectangle ;;; ERKLÄRUNG ;;; (triangle-bounding-box t) liefert die Bounding-Box von Dreieck t zurück. ;;; BEISPIEL ;;; Linksüberhängend: ;;; (triangle-bounding-box (make-triangle (make-posn 0 0) 2 3 2)) ;;; (make-rectangle (make-posn -0.25 0) (make-posn 2.25 #i1.984313483298443)) ;;; Rechtsüberhängend: ;;; (triangle-bounding-box (make-triangle (make-posn 0 0) 3 2 2)) ;;; => (make-rectangle (make-posn 0 0) (make-posn 2.25 #i1.984313483298443)) ;;; Nicht überhängend: ;;; (triangle-bounding-box (make-triangle (make-posn 0 0) 2 2 2)) ;;; => (make-rectangle (make-posn 0 0) (make-posn 2 #i1.7320508075688772)) ;;; DEFINITION (define triangle-bounding-box (lambda (t) (let ((x (posn-x (triangle-origin t))) (y (posn-y (triangle-origin t))) (a (triangle-a t)) (b (triangle-b t)) (c (triangle-c t))) (let ((cos-alpha (/ (- (+ (* b b) (* c c)) (* a a)) (* 2 b c))) (cos-beta (/ (- (+ (* a a) (* c c)) (* b b)) (* 2 a c)))) (let ((hc (* a (sqrt (- 1 (* cos-beta cos-beta)))))) (if (< cos-beta 0) (let ((cprime (* a (- cos-beta)))) (make-rectangle (make-posn (- x cprime) y) (make-posn (+ cprime c) hc))) (if (< cos-alpha 0) (let ((cprime (* b (- cos-alpha)))) (make-rectangle (make-posn x y) (make-posn (+ cprime c) hc))) (make-rectangle (make-posn x y) (make-posn c hc)))))))))