Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Python propose un module dénommé "turtle" qui permet de dessiner des figures géométriques dans une fenêtre.
Mais avant d'aborder ce module nous allons faire une petite digression : personnaliser l'IDLE (interface de développement).
Si vous êtes comme moi, vous trouvez que la taille de police dans l'éditeur est trop petite.
Ce n'est pas compliqué d'agrandir la taille de police, le type de police , etc.
Commande : Options / Configurer IDLE
Exemple : cliquez sur l'onglet "Fonts/Tabs" , déroulez la liste "size" et sélectionnez 12
Vous pouvez aussi cliquer sur l'onglet "highlights" (coloration) pour changer la couleur de texte des commentaires.
Turtle signifie en anglais "tortue".
C'est avec ce module que l'on peut réaliser dans Python de jolies figures géométriques.
Il faut bien sûr importer le module turtle.
Il faut préciser la vitesse de traçage avec la fonction speed(). Ici vitesse très lente car le paramètre vaut 1.
Ensuite vous retrouvez toujours les mêmes types de commandes : forward(pas), left(angle) , right(angle).
Ne pas oubliez de terminer le programme avec l'instruction mainloop() pour redonner la main à l'utilisateur.
Première chose : le graphique ne s'affiche pas dans la fenêtre "Shell" comme pour un programme normal, mais dans une autre fenêtre : "Python turtle graphics".
Le graphique obtenu :
Question : Pour le chemin devienne un polygone (une forme fermée), il faudrait combien de commandes en plus ?
Réponse : deux instructions : un virage à gauche de 90° et un déplacement de 200.
Un carré est un polygone régulier de 4 côtés égaux et 4 angles égaux (angles droits).
Deux exemples de programmes ci-dessous.
Par défaut la couleur du trait est noir. Ici je demande qu'il soit rouge avec la fonction pencolor().
Le côté du carré désiré est saisi dans la variable c.
Rappel : toute saisie avec la fonction input() est de type string ;
il faut donc convertir le contenu de c en un numérique avec la fonction eval().
Ensuite vous avez 4 fois le même couple d'instructions : forward(c) et left(90)
On aurait pu écrire le code d'une façon beaucoup plus correcte sur le plan algorithmique.
Tapez le programme suivant :
A chaque passage dans la boucle l'argument de la commande forward est plus grand de 10. Donc on dessine une sorte de labyrinthe.
Le rendu :
Je veux réaliser un programme très généraliste capable de produire n'importe quel polygone régulier : carré, pentagone, hexagone, octogone,
décagone.
Piqure de rappel en matière de géométrie !
Dans tous les cas la somme des "virages à gauche" doit être égale à 360° afin que la tortue revienne à sa position de départ.
Donc pour un carré, chaque "virage à gauche" doit avoir un angle de : 360/4 = 90°
Et pour un pentagone , chaque "virage à gauche" doit avoir un angle de : 360/5 = 72°
etc.
Il y a un contrôle de saisie basé sur l'opérateur "not in … " : tant que n n'est pas inclus dans la chaine "456810" on peut répéter la saisie.
Pour qu'il y ait au moins un passage dans la boucle, il faut une valeur initiale à n , valeur non comprise dans la chaine "456810".
Le programme est très court grâce à une structure "for i in range(n):".
À la place de mainloop() on peut utiliser l'instruction exitonclick() : si clic sur le graphique, l'utilisateur reprend la main.
Il faut utiliser la fonction cercle(rayon, [angle]).
Le seul argument obligatoire est le rayon.
Tapez le programme suivant :
L'argument de la fonction speed() peut être un entier (entre 0 et 10) mais aussi une chaine : "fast", "normal", "slow", …
Remarque : la tortue tourne à gauche. Si vous voulez qu'elle tourne à droite la valeur du rayon doit être négative.
Stade : un rectangle avec à chaque extrémité deux demi-cercles.
Tapez le programme suivant :
Vous pouvez souhaitez que la forme dessinée soit remplie d'une certaine couleur.
Reprenons le programme "tortue_polygone.py" et améliorons le !
Pour réouvrir un programme récemment fermé, vous pouvez dans l'IDLE produire la commande par menu : File/Recent Files...
Sélectionnez tout le code, faites une copie (commande : Edit/copy), créez un nouveau fichier (commande : File/New File) et collez le contenu
du presse-papier.
Le programme devient conséquent.
Le graphique obtenu après avoir saisi 5 et 200 :
C'est joli, vous trouvez pas !
En parenthèse la valeur de l'abscisse puis celle de l'ordonnée de chaque angle.
La fonction position() retourne les coordonnées x et y de la tortue à un stade donné.
Ce programme s'éxécute dans deux fenêtre : un carré est dessiné dans la fenêtre "graphique" et les affichages se font dans la fenêtre "shell".
On devine que la fenêtre graphique est un repère cartésien (dont les axes sont masqués).
Au départ la tortue est à l'origine du repère cartésien (x=0, y=0)
Donc comme l'origine du repère cartésien est le centre de la fenêtre graphique, l'abscisse et l'ordonnée de la tortue peuvent être des valeurs négatives.
Plutôt que d'utiliser les fonctions forward(), left(), right() nous utilisons la fonction goto(x,y).
Vous notez que parfois les valeurs de x et y sont négatives.
Capture de la fenêtre "graphique" ci-dessous :
Sans qu'on le demande, on a un segment de l'origine jusqu'au premier angle (-300, -300).
Pour éviter ce segment disgracieux du point d'origine vers le premier point par le programme, il suffit de "soulever le stylo" ...
Vous avez vu que dessiner des polynomes réguliers c'est facile. Mais dessiner des triangles demande de faire appel à des notions de géométrie plus avancées ...
Rappel : un triangle équilatéral est un triangle dont les 3 côtés et les trois angles sont égaux.
Comme la somme des angles d'un triangle est toujours égale à 180°, chaque angle d'un équatéral fait 180/3 = 60°
Le code :
Le rendu :
Observez bien ce graphique !
La tortue est orientée vers le bas et la gauche.
Donc si vous rajoutiez "forward(200)" le tracé serait orienté vers la gauche et le bas.
Analyse du code :
Le code laisse dubitatif ...
Chaque angle doit faire 60° et pourtant je programme des "left(120)" ...
L'explication est simple : pour former un angle interne de 60° il faut faire effectuer à la tortue un virage très serré de (180° - 60° = 120°).
C'est la notion d'angles supplémentaires (somme de deux angles supplémentaires =180°).
En fait une étoile à 6 branches ("étoile de David") est faite de deux triangles équilatéraux qui se superposent.
Le rendu :
Il faut donc dessiner le premier triangle équilatéral puis lever le stylo, déplacer la tortue vers le point (0,100) et dessiner le deuxième triangle.
Extrait du code :
Remarque :
Nouvelle instruction : home()
Suite au premier triangle, la tortue était dirigée vers la gauche et vers le bas. Il faut qu'elle soit de nouveau disposée à tracer vers la droite
grâce à cette instruction.
Chaque angle du triangle doit faire 36° (180 / 5).
Donc pour obtenir un angle interne de 36° il faut faire un virage serré à gauche de 144 (180 - 36).
Le rendu :
Grâce à l'instruction home() la tortue est de nouveau orientée de façon normale et retrouve la position 0,0.
Pensez à cette instruction, si vous devez dans un même graphique enchainer le dessin de plusieurs formes.
Si vous voulez dessiner directement un triangle rectangle ce sera la prise de tête.
En effet vous devriez saisir : le grand côté de l'angle droit puis le petit côté de l'angle droit.
Ensuite calculer l'hypothénuse en utilisant le célèbre théorème de Pythagore (
le carré de l'hypoténuse est égal à la somme des carrés des côtés de l'angle droit)
Mais c'est pas tout il faut déterminer les deux autres angles. Il faut donc faire de la trigonométrie
(branche des mathématiques qui traite des relations entre distances et angles un triangle rectangle).
Avec Python c'est possible, puisque le module math propose toutes les fonctions trigonométriques.
Mais c'est vraiment se compliquer la vie, il y a beaucoup plus simple : un triangle rectangle est inscrit dans un rectangle.
Il suffit donc de dessiner un rectangle mais de lever le stylo pour ne pas tracer une longueur et une largeur puis de baisser le stylo pour dessiner une diagonale du rectangle (l'hypothènuse du triangle rectangle).
Le rendu :
Le code :
Je vous communique la fin du code.
J'ai saisi dans la variable "lo" le grand côté et dans la variable "la" le petit côté.