(require-library "graphics.ss" "graphics") (define pi 3.1415926) (define pi/2 (/ pi 2)) ; SIGNATUR ; hilbert : number number number -> void ; ERKLÄRUNG ; (hilbert width height n) zeichnet eine Hilbert-Kurve der Ordnung n ; in ein Fenster der Grösse width x height ; DEFINITION (define hilbert (lambda (width height n) (open-graphics) (let* ((width (max 10 width)) (height (max 10 height)) (space (min width height)) (n (max n 1)) (xy0 (make-posn 10 10)) (v (open-viewport "Hilbert" (+ 20 width) (+ 20 height)))) (draw-h v xy0 0 (/ space (expt 2 n)) 1 n) (get-mouse-click v) (close-viewport v) (close-graphics)))) ; SIGNATUR ; polar->posn : number number number number -> posn ; ERKLÄRUNG ; (polar->posn p r phi) addiert die Vektoren p und ; (r, phi) (in Polarkoordinaten). ; DEFINITION (define polar->posn (lambda (p r phi) (make-posn (+ (posn-x p) (* r (cos phi))) (- (posn-y p) (* r (sin phi)))))) ; SIGNATUR ; draw-line-polar : viewport posn number number color -> posn ; ERKLÄRUNG ; (draw-line-polar v p r phi c) zeichnet im Fenster v eine Linie ; von p nach p' in Farbe c, wobei p' = (polar->posn p r phi). ; Rückgabewert ist p'. ; DEFINITION (define draw-line-polar (lambda (v p r phi c) (let ((p1 (polar->posn p r phi))) ((draw-line v) p p1 c) p1))) ; SIGNATUR ; make-color : number -> color ; ERKLÄRUNG ; (make-color n) liefert eine Farbe in Abhängigkeit von n ; DEFINITION (define make-color (lambda (n) (make-rgb (* (remainder n 3) .5) (* (remainder (quotient n 2) 3) .5) (* (remainder (quotient n 4) 3) .5)))) ; SIGNATUR ; draw-h : viewport posn number number number -> posn ; ERKLÄRUNG ; (draw-h v p phi delta dir n) zeichnet in Fenster v beginnend von p ; in Richtung phi/dir die Hilbertkurve n-ter Ordnung. Ein ; Liniensegment hat dabei die Länge delta. Rückgabewert ist ; die Endposition. ; DEFINITION (define draw-h (lambda (v p0 phi delta dir n) (if (= n 0) p0 (let* ((c (make-color n)) (turn (* dir pi/2)) (p1 (draw-h v p0 (- phi turn) delta (- dir) (- n 1))) (p2 (draw-line-polar v p1 delta phi c)) (p3 (draw-h v p2 phi delta dir (- n 1))) (p4 (draw-line-polar v p3 delta (- phi turn) c)) (p5 (draw-h v p4 phi delta dir (- n 1))) (p6 (draw-line-polar v p5 delta (+ phi pi) c)) (p7 (draw-h v p6 (+ phi turn) delta (- dir) (- n 1)))) p7))))