Logiciel libre de géométrie, d'analyse et de simulation multiplateforme par Yves Biton

Accueil Tutoriels l’API de MathGraph32

Programmer une figure en Python : l’arbre de Pythagore

modification lundi 20 avril 2024.


Depuis la version 7.9.1, MathGraph32 permet de créer des objets dans une figure en langage Python ou JavaScript.

Ici nous allons générer un arbre de Pythagore en Python.

Vous pouvez voir l’équivalent programmé en JavaScript sur cette page.

Si vous changez le code Python ci-dessous, cliquez sur le bouton Exécuter en dessous de ce cadre d’édition.

La figure obtenue est dynamique : vous pouvez capturer les points A et B une fois la figure construite.
Cliquez sur un des boutons sur fond jaune pour lancer la construction à un nveau donné.

Vous trouverez en bas de cet article des explications sur la méthode employée et les fonctions de l’API utilisées.


Comment est construite la figure

La construction de base figure est affichée ci-dessous :

Les deux points de base sont A et B.

On commence par construire l’image D du point B par la rotation de centre A et d’angle 90 (l’unité d’angle de la figure est le degré par défaut) puis le point C image de D par la translation de vecteur AB. On construit ensuite le point E, image de C par la similitude directe de centre D, angle 45° et rapport sqrt(2)/2 et on ajoute les polygones ABCD et CDE qu’on remplit d’une surface.
Si la profondeur maximale n’est pas atteinte on rappelle la fonction en replaçant une première fois A et B par E et C, puis par D et E (dans cet oordre).

Explications concernant le code de l’API de MathGraph32 utilisé ici :

On commence par créer les trois points de base A et B avec les lignes de codes suivantes :

A = addFreePoint({'x':6*width/14, 'y':height - 20, 'name':'A', 'color':'red', 'absCoord': True})
B = addFreePoint({'x':8*width/14, 'y':height - 20, 'name':'B', 'color':'red', 'absCoord': True})

On emploie ici la syntaxe objet pour les créer pour pouvoir passer le paramètre absCoord à True ce qui implique sue les paramètres coordonnées x et y pour ces points sont donnés en coordonnées SVG (abscisses à 0 au coin haut gauche et croissantes de la gauche vers la droite, ordonnées 0 au coin haut et gauche et croissantes du bas vers le haut).

Le code de la fonction tree(A, B, prof) : est assez facile à comprendre avec les explications ci-dessus.

Les fonctions tree0, tree1 etc ... créent l’arbre de récursion avec un niveau de récursion donné en détruisant d’abord les objets créés après le point W (qui ne sert qu’à ça).

Les lignes suivantes créent des boutons qui, lorsqu’on cliquera dessus, lanceront les figures ci-dessus :

btn0 = addActionButton('tree prof = 0', tree0, 10, 10, 'btn0')
btn1 = addActionButton('tree prof = 1', tree1, 10, 40, 'btn1')
btn2 = addActionButton('tree prof = 2', tree2, 10, 70, 'btn2')
btn3 = addActionButton('tree prof = 3', tree3, 10, 100, 'btn3')
btn4 = addActionButton('tree prof = 4', tree4, 10, 130, 'btn4')
btn5 = addActionButton('tree prof = 5', tree5, 10, 160, 'btn5')
btn9 = addActionButton('tree prof = 9', tree9, 10, 190, 'btn9')
btn10 = addActionButton('tree prof = 10', tree10, 10, 220, 'btn10')
btn11 = addActionButton('tree prof = 11', tree11, 10, 250, 'btn11')

Au-dessous de ces lignes les deux lignes suivantes :

W = addFreePoint(0, 0, 'W')
setHidden(W)

créent après ces boutons un point caché W dont la seule utilité est d’aider à détruire les objets créés après lui au début de l’exécution des fonctions tree0, tree1.

Examinons par exemple le code de la fonction tree5 :

def tree5():
  deleteAfter('W')
  tree(A, B, 5)
  displayButtonsOnTop()

Elle commence par détruire les éventuels objets créés après le point W. Ces objets sont par exemple ceux qui ont été créé en cliquant précédemment sur un des boutons.
On lance l’exécution de la fonction tree sur les points A, B et C au niveau 5.
On appelle ensuite la fonction displayButtonsOnTop.
Cette fonction reclasse la représentation graphique des boutons au-dessus de celle des objets générés par la fonction hilbert de façon à ce que ces boutons restent bien visibles une fois la fonction exécutée.

Examinons le code de cette fonction :

def displayButtonsOnTop():
   displayOnTop('btn0')
  displayOnTop('btn1')
  displayOnTop('btn2')
  displayOnTop('btn3')
  displayOnTop('btn4')
  displayOnTop('btn5')
  displayOnTop('btn9')
  displayOnTop('btn10')
  displayOnTop('btn11')

Le premier bouton a par exemple été créé avec le code suivant : btn0 = addActionButton(’tree prof = 0’, tree0, 10, 10, ’btn0’)
Le dernier argument ’btn0’ est un tag MathGraph32 qui a été mis sur ce bouton.
C’est ce tag qui est passé en argument dans la ligne : displayOnTop(’btn0’)
Pourquoi ne pas avoir ici passé comme argument l’objet btn0 ? La raison est que le bouton est nécessairement créé après la fonction hilbertNiv0 qui elle-même utilise la fonction displayButtonsOnTop.
Comme on ne peut pas utiliser cet objet avec les règles usuelles de la programmation Python, on utilise le tag qui lui a été affecté, la chaîne de caractères ’btn0’