Objectif

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.

Des carrés imbriqués les uns dans les autres.

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.

Dessiner un carré

  1. 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 xx 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 aa degrés sur sa droite, écrire une fonction carre(l) permettant de dessiner un carré de côté ll 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 ?

  2. L'utilisation d'une boucle for i in range(4) permettra de limiter les lignes de code.

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

  4. La fonction essai fait appel à la fonction carre avec une variable fixée.
    On obtient un carré de 50px de côté.

Carrés imbriqués - niveau 1

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.

Carrés imbriqués à 50% de la longueur précédente
  1. Après l'exécution de la fonction initiale, permettant de tracer le carré ABCD de côté ll, comment amener la tortue en position E (voir la figure) et la pivoter pour tracer le second carré EFGH ?

  2. 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 BEF^\widehat{BEF} 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).

  3. Calculer la longueur du côté du carré EFGH.

  4. En utilisant le théorème de Pythagore dans le triangle BEF, on obtient l22\displaystyle\sqrt{\frac{l^2}{2}}.

  5. Compléter le programme suivant permettant d'obtenir la figure avec nn 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= ...
            
  6. Le script se trouve sur cette page.

Carrés imbriqués - niveau 2

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 :

AE=14AB\displaystyle AE = \frac{1}{4} AB

Carrés imbriqués à 25% de la longueur précédente
  1. A l'aide des relations trigonométriques, exprimer l'angle BEF^\widehat{BEF} en fonction de ll, longueur de AB.

  2. Le triangle BEF est rectangle en B. D'après les relations trigonométriques, on obtient :

    BEF^=tan1(BFEB)=tan1(0.25l0.75l)=tan1(13)\displaystyle \widehat{BEF} = \mathrm{tan}^{-1}\left(\frac{BF}{EB}\right) = \mathrm{tan}^{-1}\left(\frac{0.25\,l}{0.75\,l}\right)= \mathrm{tan}^{-1}\left( \frac{1}{3} \right)

  3. 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 BEF^\widehat{BEF} à partir de la relation précédente puis le transformer en degrés ?

  4. angle =atan(1/3)*180/pi

  5. Exprimer maintenant la longueur EF en fonction de ll.

  6. Le triangle BEF est rectangle en B. D'après le théorème de Pythagore, on obtient :

    EF=(0.75l)2+(0.25l)2=l410\displaystyle EF = \sqrt{\left(0.75\,l\right)^2+\left(0.25\,l\right)^2} = \frac{l}{4}\sqrt{10}

  7. En réutilisant le programme du niveau 1, écrire une fonction figure2(l,n) permettant de tracer nn carrés imbriqués dans un carré de longueur ll en respectant les conditions de construction.

  8. Le script se trouve sur cette page.

Carrés imbriqués - dernier niveau

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 ll longueur du premier carré, nn nombre de carrés, mais aussi aa coefficient inférieur à 1 tel que AE=a×ABAE = a \times AB.

  1. En reprenant le même raisonnement qu'au-dessus, déterminer la valeur de l'angle BEF^\widehat{BEF} en fonction de ll.

  2. BEF^=atan(a1a)\displaystyle \widehat{BEF} = \mathrm{atan}\left( \frac{a}{1-a} \right)

  3. Exprimer maintenant la longueur EF en fonction de ll.

  4. EF=((1a)l)2+(al)2\displaystyle EF=\sqrt{\left( \left(1-a\right)\,l\right)^2+\left(al\right)^2}

  5. Ecrire une fonction figure3(l,n,a) permettant de tracer nn carrés imbriqués dans un carré de longueur ll en respectant les conditions de construction.

  6. 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 ll, d'ajouter des couleurs, etc. Voir la fonction variante(l,a) du script.

  7. Quelles lignes de code pourrait-on ajouter pour renvoyer un message d'erreur si l'utilisateur entre une valeur de aa supérieure à 1 ?

  8. Il suffit d'ajouter if a>1: return "Impossible" en début de programme.