9.1 Les chiffres de calculatrice

PIC

Cette activité est basé sur le fait que tous les nombres de calculatrice peuvent être obtenus à l’aide du patron ci-contre :

9.1.1 Remplir un rectangle

PIC

Si l’on souhaite par exemple tracer un rectangle rempli de 100 sur 200, une première idée peut être de dessiner le rectangle de 100 sur 200 puis de tracer un rectangle de 99 sur 199 puis un rectangle de 98 sur 198 ... jusqu’à ce que le rectangle soit entièrement rempli.
Commençons par définir un rectangle de longueur et largeur dépendant de deux variables.

pour rec :lo :la  
repete 2[av :lo td 90 av :la td 90]  
fin

Pour remplir notre grand rectangle, on va donc exécuter :
rec 100 200 rec 99 199 rec 98 198 ..... rec 1 101

Définissons alors une procédure rectangle dédié à tracer ce rectangle rempli.

pour rectangle :lo :la  
rec :lo :la  
rectangle :lo-1 :la-1  
fin

On teste rectangle 100 200 et on s’aperçoit qu’il y a un problème : la procédure ne s’arrête pas lorsque le rectangle est rempli, elle continue de tracer des rectangles ! On va donc ajouter un test permettant de détecter si la longueur ou la largeur est égale à 0. A ce moment, on demande au programme de s’interrompre avec la commande stop.

pour rectangle :lo :la  
si ou :lo=0 :la=0 [stop]  
rec :lo :la  
rectangle :lo-1 :la-1  
fin

Note : à la place d’utiliser la primitive ou, on peut utiliser le symbole « | » : on obtiendrait :

si :lo=0 | :la=0 [stop]

9.1.2 Le programme

Nous avons besoin du rectangle rempli précédent :

pour rec :lo :la  
si :lo=0 |:la=0[stop]  
repete 2[av :lo td 90 av :la td 90]  
rec :lo-1 :la-1  
fin

Nous supposons ici que la tortue part du coin inférieur gauche. Nous allons définir une procédure appelée chiffre admettant 7 argument :a, :b, :c, :d, :e, :f, :g. Quand :a vaut 1, on dessine le rectangle 1. Si :a vaut 0, on ne le dessine pas. Voilà le principe.

On obtient la procédure suivante :

pour chiffre :a :b :c :d :e :f :g  
# On dessine le rectangle 1  
si :a=1 [rec 160 40]  
# On dessine le rectangle 2  
si :b=1 [rec 40 160]  
lc td 90 av 120 tg 90 bc  
# On dessine le rectangle 3  
si :c=1 [rec 160 40]  
lc av 120 bc  
# On dessine le rectangle 5  
si :e=1 [rec 160 40]  
# On dessine le rectangle 4  
tg 90 lc re 40 bc  
si :d=1 [rec 160 40]  
# On dessine le rectangle 6  
td 90 lc av 120 tg 90 bc  
si :f=1 [rec 160 40]  
# On dessine le rectangle 7  
lc av 120 tg 90 re 40 bc  
si :g=1 [rec 160 40]  
fin

9.1.3 Création d’une petite animation

Nous allons ici simuler un compte à rebours en faisant apparaitre succesivement les chiffres de 9 à 0 par ordre décroissant.

pour rebours  
ve ct chiffre 0 1 1 1 1 1 1 attends 60  
ve ct chiffre 1 1 1 1 1 1 1 attends 60  
ve ct chiffre 0 0 1 0 1 1 0 attends 60  
ve ct chiffre 1 1 1 1 0 1 1 attends 60  
ve ct chiffre 0 1 1 1 0 1 1 attends 60  
ve ct chiffre 0 0 1 1 1 0 1 attends 60  
ve ct chiffre 0 1 1 1 1 1 0 attends 60  
ve ct chiffre 1 1 0 1 1 1 0 attends 60  
ve ct chiffre 0 0 1 0 1 0 0 attends 60  
ve ct chiffre 1 1 1 0 1 1 1 attends 60  
fin

Petit problème : il y a un effet de clignotement désagréable pendant la création de chaque chiffre. Pour fluidifier cela on va utiliser les primitives animation, stopanimation et rafraichis.

On obtient ainsi le programme modifié :

pour rebours  
# On passe en mode animation  
animation  
ve ct chiffre 0 1 1 1 1 1 1 rafraichis attends 60  
ve ct chiffre 1 1 1 1 1 1 1 rafraichis attends 60  
ve ct chiffre 0 0 1 0 1 1 0 rafraichis attends 60  
ve ct chiffre 1 1 1 1 0 1 1 rafraichis attends 60  
ve ct chiffre 0 1 1 1 0 1 1 rafraichis attends 60  
ve ct chiffre 0 0 1 1 1 0 1 rafraichis attends 60  
ve ct chiffre 0 1 1 1 1 1 0 rafraichis attends 60  
ve ct chiffre 1 1 0 1 1 1 0 rafraichis attends 60  
ve ct chiffre 0 0 1 0 1 0 0 rafraichis attends 60  
ve ct chiffre 1 1 1 0 1 1 1 rafraichis attends 60  
# On rebascule en mode dessin classique  
stopanimation  
fin