4. Animer le Monde
1 Exercice 4.8.1
2 Exercice 4.8.2
3 Exercice 4.8.3
4 Exercice 4.8.4
5 Exercice 4.8.6
6.0.1.11

4. Animer le Monde

1 Exercice 4.8.1

(define (horloge-numerique T)        ; T = duree de l'animation

  (local [(define SCENE (rectangle 300 200 'solid "yellow"))

          ; Le Monde est réduit au temps t en secondes

          (define INIT 0)

          (define (suivant t)

            (+ t 1))

          (define (dessiner t)

            (place-image (text (number->string t) 128 "blue")

                         150 100 SCENE))   ; image centree

          (define (final? t)

            (>= t T))]

    (big-bang INIT

              (on-tick suivant 1)    ; horloge a la seconde

              (on-draw dessiner 300 200)

              (stop-when final?))))

> (horloge-numerique)

montre numérique

2 Exercice 4.8.2

Il suffit de connaître les coordonnées paramétriques d’un point mobile M(x,y) se déplaçant sur un cercle de centre (a,b) et de rayon R :

x = a + R cos(t), y = b + R sin(t)

Pour t=0, la balle se trouvera sur le pôle Est du cercle trajectoire.

(define (anim-balle)      ; exercice 4.8.2 du livre

  (local [(define TAILLE 100)

          (define C (/ TAILLE 2))

          (define SCENE (rectangle TAILLE TAILLE 'solid "yellow"))

          (define RAYON 12)      ; rayon de la balle

          (define BALLE (circle RAYON 'solid "red"))

          (define R 30)         ; rayon de la trajectoire circulaire

          (define INIT 0)

          ; le monde est l'angle polaire t du centre de la balle

          (define (suivant t)

            (+ t 0.05))

          (define (dessiner t)

            (place-image BALLE (+ C (* R (cos t))) (+ C  (* R (sin t))) SCENE))

          (define (final? t)

            (>= t (* 6 pi)))]

    (big-bang INIT

              (on-tick suivant)

              (on-draw dessiner)

              (stop-when final?))))

> (anim-balle)

balle qui tourne

3 Exercice 4.8.3

C’est une simple variation sur l’exercice précédent. L’utilisation de la primitive add-line simplifie le travail...

(define (horloge-analogique)

  (local [(define T 200)   ; taille du canvas

          (define T/2 (quotient T 2))

          (define SCENE (underlay (rectangle T T 'solid "yellow")

                                  (circle T/2 'solid "black")

                                  (circle (- T/2 5) 'solid "white")

                                  (circle 10 'solid "black")))

          ; Le Monde est le nombre t de secondes écoulées.

          (define INIT 0)

          (define pi/30 (/ pi 30))     ; 1 seconde de temps <==> pi/30 radians

          (define RED (make-pen "red" 3 'solid 'round 'round))   ; pour un trait épais...

          (define R (- T/2 20))        ; longueur de l'aiguille

          (define (suivant t)

            (+ t 1))

          (define (dessiner t)

            (local [(define rt (* (- t 15) pi/30))]    ; le "vrai" t est décalé de 15 sec

              (place-image (text (number->string (modulo t 60)) 18 "blue")

                           16 20

                           (add-line SCENE

                                     T/2 T/2 (+ T/2 (* R (cos rt))) (+ T/2 (* R (sin rt)))

                                     RED))))]

    (big-bang INIT

              (on-tick suivant 1)     ; horloge qui bat la seconde

              (on-draw dessiner T T))))

> (horloge-analogique)

montre analogique

4 Exercice 4.8.4

Il n’y a pas besoin d’horloge dans cet exercice, d’ou l’absence du specificateur on-tick.

(define (anim-couleurs)

  (local [(define SIZE 255)

          (define (normalise x)   ; forcer x dans [0,255]

            (min 255 (max 0 x)))

          ; Le Monde m est l'abscisse de la souris

          (define (dessiner m)

            (rectangle SIZE SIZE 'solid (make-color (- 255 m) m 0)))

          (define (souris m x y evt)

            (normalise x))

          (define (clavier m k)

            (cond ((key=? k "up") (normalise (- m 1)))

                  ((key=? k "down") (normalise (+ m 1)))

                  (else m)))]

     (big-bang 255                ; depart en vert

               (on-draw dessiner SIZE SIZE)

               (on-key clavier)

               (on-mouse souris))))

5 Exercice 4.8.6

On utilise la possibilité en Scheme d’avoir une variable dynamiquement typée, tantôt un nombre, tantôt un booléen !

(define (horloge-numerique-stop T)

  (local [(define SCENE (rectangle 300 200 'solid "yellow"))

          (define INIT 0)

          (define (suivant t)

            (+ t 1))

          (define (dessiner t)

            (place-image

              (text (if (boolean? t) "" (number->string t))

                    128 "blue")

              150 100 SCENE))

          (define (clavier t key)

            (if (key=? key "q") true t))

          (define (final? t)

            (or (boolean? t) (>= t T)))]

    (big-bang INIT

              (on-tick suivant 1)

              (on-draw dessiner)

              (on-key clavier)

              (stop-when final?))))