Boucle for Module turtle
Dessiner avec Turtle des carrés imbriqués. On programmera dans un premier temps un cas simple, puis un second, avant de voir le cas général.
On souhaite programmer en Python une figure particulière, celle de carrés imbriqués les uns dans les autres. On utilisera pour cela le module Turtle, module graphique permettant de piloter une tortue à l'écran à l'aide d'instructions basiques. Il faudra donc, en début de script, ajouter une commande from turtle import *
afin de pouvoir utiliser les instructions de Turtle.
A l'exécution du script, la tortue est positionnée au centre de l'écran et dirigée vers la droite.
A l'aide des instructions forward(x)
, qui permet de faire avancer la tortue de pixels (l'écran de la calculatrice fait 320 pixels en longueur et 222 pixels en hauteur), et right(a)
, qui permet de faire pivoter la tortue de degrés sur sa droite, écrire une fonction carre(l)
permettant de dessiner un carré de côté de façon à ce que la tortue reprenne en fin de programme sa position initiale, tournée vers la droite.
Avec quelle instruction peut-on limiter le nombre de lignes de code ?
L'utilisation d'une boucle for i in range(4)
permettra de limiter les lignes de code.
Il est possible de déplacer la tortue ailleurs sur l'écran à l'aide de l'instruction goto(x,y)
permettant de déplacer la tortue vers le point de coordonnées (x;y), le point (0;0) correspondant au centre de l'écran. Cependant, tout déplacement de la tortue laisse une trace si le "stylo" qu'elle tient en main n'est pas relevé. A l'aide des instructions penup()
et pendown()
, écrire une nouvelle fonction essai()
permettant de tracer un carré de côté 50px au point de coordonnées (-50 ; 50).
On souhaite réaliser la figure ci-contre, c'est-à-dire imbriquer des carrés de façon à ce que les sommets du carré intérieur soient situés au milieu des côtés du carré supérieur.
Après l'exécution de la fonction initiale, permettant de tracer le carré ABCD de côté , comment amener la tortue en position E (voir la figure) et la pivoter pour tracer le second carré EFGH ?
La tortue trace son second carré à partir du milieu du côté du premier carré. Etant donné sa position et son orientation à l'issue du premier dessin, il suffit d'utiliser l'instruction forward(l/2)
pour qu'elle se positionne à la moitié du segment.
Il faut maintenant calculer l'angle de pivot afin de donner la bonne orientation à notre tortue. Le triangle BEF est isocèle rectangle en B d'où un angle de 45° que l'on code avec l'instruction right(45)
.
Calculer la longueur du côté du carré EFGH.
En utilisant le théorème de Pythagore dans le triangle BEF, on obtient .
Compléter le programme suivant permettant d'obtenir la figure avec carrés et l'exécuter sur la calculatrice.
from math import * from turtle import * def carre(l): for i in range(4): forward(l) right(90) def figure(... , ...): penup() goto(... , ...) pendown() for i in range(n): carre(l) forward(... , ...) right(...) l= ...
Le script se trouve sur cette page.
On souhaite maintenant réaliser une nouvelle fonction figure2(l,n)
identique à la précédente mais en changeant les conditions de construction.
Le sommet du second carré doit maintenant se trouver à 25% du côté du carré précédent. Autrement dit, si l'on reprend la figure précédente :
A l'aide des relations trigonométriques, exprimer l'angle en fonction de , longueur de AB.
Le triangle BEF est rectangle en B. D'après les relations trigonométriques, on obtient :
La fonction atan()
du module math
renvoie un angle en radians tandis que les changements d'orientation du module turtle
sont exprimés en degrés. Quelle ligne de code faudrait-il écrire pour calculer l'angle à partir de la relation précédente puis le transformer en degrés ?
angle =atan(1/3)*180/pi
Exprimer maintenant la longueur EF en fonction de .
Le triangle BEF est rectangle en B. D'après le théorème de Pythagore, on obtient :
En réutilisant le programme du niveau 1, écrire une fonction figure2(l,n)
permettant de tracer carrés imbriqués dans un carré de longueur en respectant les conditions de construction.
Le script se trouve sur cette page.
On aimerait maintenant modifier notre programmer que les carrés imbriqués soient très resserrés, tout comme sur la première illustration de cette activité.
On propose de créer une dernière fonction qui prendra en argument non seulement longueur du premier carré, nombre de carrés, mais aussi coefficient inférieur à 1 tel que .
En reprenant le même raisonnement qu'au-dessus, déterminer la valeur de l'angle en fonction de .
Exprimer maintenant la longueur EF en fonction de .
Ecrire une fonction figure3(l,n,a)
permettant de tracer carrés imbriqués dans un carré de longueur en respectant les conditions de construction.
Le script se trouve sur cette page.
On peut proposer aux élèves plus avancés de trouver des variantes en utilisant, par exemple, un autre type de boucle : le programme dessine des carrés jusqu'à ce que la longueur l soit inférieure à 5 px. On peut aussi proposer aux élèves de positionner le carré sur l'écran en fonction de la valeur de , d'ajouter des couleurs, etc. Voir la fonction variante(l,a)
du script.
Quelles lignes de code pourrait-on ajouter pour renvoyer un message d'erreur si l'utilisateur entre une valeur de supérieure à 1 ?
Il suffit d'ajouter if a>1: return "Impossible"
en début de programme.