(require-library "graphics.ss" "graphics") (define pi 3.1415926) ; SIGNATUR ; sierpinski : number number number -> void ; ERKLÄRUNG ; (sierpinski n width height) zeichnet eine Sierpinski-Fläche der ; Ordnung n in ein Fenster der Grösse width x height ; DEFINITION (define sierpinski (lambda (n width height) (open-graphics) (let* ((width (max 10 width)) (height (max 10 height)) (v (open-viewport "Sierpinski" width height)) ;; Mittelpunkt des Fensters (xm (/ width 2)) (ym (/ height 2)) ;; Sinnvoller Radius (r (- (min xm ym) 1)) ;; Ecken eines gleichseitigen Dreiecks (Polarkoordinaten) (phi0 (/ pi 2)) (phi1 (+ phi0 (/ (* 2 pi) 3))) (phi2 (+ phi1 (/ (* 2 pi) 3))) ;; Umgerechnet in rechtwinklige Koordinaten (p0 (polar->posn xm ym r phi0)) (p1 (polar->posn xm ym r phi1)) (p2 (polar->posn xm ym r phi2))) (draw-triangle v n p0 p1 p2) (get-mouse-click v) (close-viewport v) (close-graphics)))) ; SIGNATUR ; draw-triangle : viewport number posn posn posn -> void ; ERKLÄRUNG ; (draw-triangle v n p1 p2 p3) zeichnet Sierpinski-Dreieck der Ordnung ; n für die Punkte p1 p2 p3. ; DEFINITION (define draw-triangle (lambda (v n p1 p2 p3) (cond ((or (zero? n) (< (distance p1 p2) 2)) ((draw-line v) p1 p2) ((draw-line v) p2 p3) ((draw-line v) p3 p1)) (else (let ((p12 (middle-point p1 p2)) (p13 (middle-point p1 p3)) (p23 (middle-point p2 p3)) (n1 (- n 1))) (draw-triangle v n1 p1 p12 p13) (draw-triangle v n1 p12 p2 p23) (draw-triangle v n1 p13 p23 p3)))))) ; SIGNATUR ; distance : posn posn -> number ; ERKLÄRUNG ; (distance p1 p2) berechnet den Abstand der Punkte p1 und p2 ; DEFINITION (define distance (lambda (p1 p2) (sqrt (+ (square (- (posn-x p1) (posn-x p2))) (square (- (posn-y p1) (posn-y p2))))))) ; SIGNATUR ; square : number -> number ; ERKLÄRUNG ; quadriert das Argument (define square (lambda (x) (* x x))) ; SIGNATUR ; middle-point : posn posn -> posn ; ERKLÄRUNG ; (middle-point p1 p2) berechnet die Koordinaten des Punkts in der ; Mitte zwischen p1 und p2. ; DEFINITION (define middle-point (lambda (p1 p2) (make-posn (/ (+ (posn-x p1) (posn-x p2)) 2) (/ (+ (posn-y p1) (posn-y p2)) 2)))) ; SIGNATUR ; polar->posn : number number number number -> posn ; ERKLÄRUNG ; (polar->posn x y r phi) addiert die Vektoren (x, y) und ; (r, phi) (in Polarkoordinaten). ; DEFINITION (define polar->posn (lambda (xm ym r phi) (make-posn (+ xm (* r (cos phi))) (- ym (* r (sin phi))))))