Cette activité est basé sur le fait que tous les nombres de calculatrice peuvent être obtenus à l’aide du patron ci-contre :
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] |
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 |
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 |