(load "ub3-3.scm") ;;; SIGNATUR ;;; polygon-area: polygon -> number ;;; ERKLÄRUNG ;;; (polygon-area poly) berechnet den Flächeninhalt von Polygon poly. Der ;;; Flächeninhalt ist dabei positiv, falls die Ecken des Polygons im ;;; Uhreigersinn angegeben wurden, negativ sonst. ;;; BEISPIELE ;;; (polygon-area (make-polygon (list (make-posn 0 1) (make-posn 1 1) ;;; (make-posn 1 0)))) ;;; => 0.5 ;;; (polygon-area (make-polygon (list (make-posn 0 1) (make-posn 1 0) ;;; (make-posn 1 1)))) ;;; => -0.5 ;;; DEFINITION (define polygon-area (lambda (poly) (sum-trapezium-areas (polygon-vertices poly)))) ;;; SIGNATUR ;;; sum-trapezium-areas: list(posn) -> number ;;; ERKLÄRUNG ;;; (sum-trapezium-areas t) berechnet die Summe der Flächeninhalte der n ;;; Trapeze, die durch die Liste t = (p1, p2, ..., pn) wie folgt beschrieben ;;; werden: ;;; * (pn -> p1 -> P p1 -> P pn) ;;; * Für alle i in {1,2, n-1} (pi -> p{i+1} -> P p{i+1} -> P pi) ;;; Dabei ist mit P die Projektion auf die X-Achse gemeint. ;;; BEISPIEL ;;; (sum-trapezium-areas (list (make-posn 0 0) (make-posn 1 1) (make-posn 1 0))) ;;; => 0.5 ;;; DEFINITION (define sum-trapezium-areas (lambda (t) (+ (trapezium-area (car (reverse t)) (car t)) (sum-trapezium-areas-1 t)))) ;;; SIGNATUR ;;; sum-trapezium-areas-1: list(posn) -> number ;;; ERKLÄRUNG ;;; (sum-trapezium-areas-1 t) berechnet die Summe der Flächeninhalte der n-1 ;;; Trapeze, die durch die Liste t = (p1, p2, ..., pn) wie folgt beschrieben ;;; werden: ;;; * Für alle i in {1,2, n-1} (pi -> p{i+1} -> P p{i+1} -> P pi) ;;; Dabei ist mit P die Projektion auf die X-Achse gemeint. ;;; BEISPIEL ;;; (sum-trapezium-areas-1 (list (make-posn 0 0) (make-posn 1 1) ;;; (make-posn 1 0))) ;;; => 0.5 ;;; DEFINITION (define sum-trapezium-areas-1 (lambda (t) (cond ((null? t) ; Dieser Fall kann bei einem korrekten Aufruf nicht eintreten 0) ((null? (cdr t)) 0) (#t (+ (trapezium-area (car t) (cadr t)) (sum-trapezium-areas-1 (cdr t))))))) ;;; SIGNATUR ;;; trapezium-area: posn posn -> number ;;; ERKLÄRUNG ;;; (trapezium-area p1 p2) berechnet den Flächeninhalt des ;;; Trapezes, das durch p1 und p2 wie folgt beschrieben wird: ;;; * (p1 -> p1 -> P p2 -> P p1) ;;; Dabei ist mit P die Projektion auf die X-Achse gemeint. ;;; BEISPIEL ;;; (trapezium-area (make-posn 0 0) (make-posn 1 1)) ;;; => 0.5 ;;; DEFINITION (define trapezium-area (lambda (p1 p2) (/ (* (- (posn-x p2) (posn-x p1)) (+ (posn-y p1) (posn-y p2))) 2))) ;;; SIGNATUR ;;; shape-area : shape -> number ;;; ERKLÄRUNG ;;; (shape-area s) berechnet den Flächeninhalt von s ;;; BEISPIELE ;;; siehe circle-area, rectangle-area, line-area ;;; DEFINITION (define shape-area (lambda (s) (cond ((circle? s) (circle-area s)) ((rectangle? s) (rectangle-area s)) ((line? s) (line-area s)) ; Bis hierhin war die Funktion vorgegeben ((triangle? s) (triangle-area s)) ((polygon? s) (polygon-area s)))))