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) |

2 Exercice 4.8.2
x = a + R cos(t), y = b + R sin(t)
(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) |

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) |

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?)))) |