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

Accueil Tutoriels Exemples guidés

Une grande nouveauté : Programmer en Python une figure MathGraph32

modification jeudi 27 mars 2024.

Toutes les versions de cet article : [English] [Español] [français]



La nouvelle version 7.9.1 permet maintenant de créer des objets dans une figure en langage Python.

Pour montrer la puissance de cette nouvelle fonctionnalité nous allons montrer ci-dessous deux exemples.

D’autres articles d’explications suivront bientôt.

A noter qu’au-dessus de la fenêtre pour entrer le code Python vous avez un lien sur le mot documentation qui pointe sur l’aide de l’API de MathGraph32 (syntaxe).

Premier exemple basique : copiez-collez le code Python ci-dessous dans le cadre sur fond noir (code Python) puis cliquez sur le bouton Exécuter en dessous de ce cadre d’édition :

from mathgraph import *
# ne pas modifier la ligne ci-dessus
# afin de pouvoir utiliser les fonctions mathgraph, par exemple
# A = addPointXY(3, 3, 'A')
A = addPointXY(-5, 4, 'A') # Equivalent à A = addPointXY({'x': -5, 'y': 4, 'name': 'A'})
B = addFreePoint(6, -3, 'B')
d1 = addLineAB(A, B)
d2 = addLinePerp(A, d1, '', 'blue', '.', 3)
C = addMidpoint(A, B)
c1 = addCircleOA(C, A, 'red', '--', 2)
D = addPointXY(7, 8, 'D', 'red')
poly = addPolygon([A, B, D], '#facc2e')
setThickness(poly, 3)
addSurface(poly, 'yellow')
AB = addLengthMeasure(A, B)
c2 = addCircleOr(C, 'AB*sqrt(2)/2', 'maroon', '-', 2)

A noter que ce code est censé tourner dans une figure munie d’un repère ce qui est le cas ici (mais vous pouvez changer le type de figure dans laquelle s’exécute le code dans la liste déroulante au-dessous de la figure).

A noter aussi que dans la ligne B = addFreePoint(6, -3, ’B’), les coordonnés 6 et -3 servent à donner la position du point libre B mais vous pouvez ensuite le capturer à la souris (le point B n’est pas lié au repère).

Vous remarquerez que la figure est dynamique : quand vous capturez B, le cercle de centre C et de rayon AB*sqrt(2)/2 est redessiné de façon dynamique. C’est dû au fait que la ligne AB = addLengthMeasure(A, B) a créé dans MathGraph32 une mesure de la longueur AB et qu’on peut donc utiliser cette formule dans le rayon du cercle suivant, donné par la formule ’AB*sqrt(2)/2’.

Vous trouvez au bas de cette page un autre exemple plus sophistiqué.

Une fois la figure exécutée, des boutons au-dessous de la figure permettent de :

- soit récupérer le code Base 64 de la figure (bouton Copier le code de la figure)

- soit d’enregistrer la figure obtenue dans un fichier de suffixe mgj (bouton Télécharger la figure) c’est-à-dire un fichier de figure MathGraph32 (conseillé pour les très grosses figures comme celle de l’exemple en bas de cette page).

Vous pourrez ainsi ouvrir ensuite la figure générée avec le logiciel MathGraph32.

Voici un autre exemple de code plus sophistiqué qui va créer de façon récursive des cercles emboîtés dans un premier cercle (copiez le code ci-dessous dans le presse papier, collez le dans l’éditeur de code Python puis cliquez sur le bouton Exécuter.

A noter que la figure obtenue est dynamique : vous pouvez capturer le point A. Vous pouvez ensuite remplacer profmax = 3 par profmax = 4. Au-delà la figure comporte trop d’objets (limités à 250 000). Avec profmax = 4 le nombre d’objets créés est déjà de 56 000 environ (et à chaque niveau de plus le nombre est multiplié par 6).

Le code Python à copier dans la fenêtre d’édition de code :

from mathgraph import *
# Ne pas dépasser profMax = = 4
profmax = 3
colors = ['red', 'yellow', 'cyan', 'red', 'blue', 'red']
def color(index):
  i = (profmax - index) % len(colors)
  return colors[i]
dim = getFigDim()
width = dim[0]
height = dim[1]
k1 = addCalc('k1', '4-2*sqrt(3)') #PLus rapide à la création de passer un objet calcul MathGraph32 plutôt qu'une valeur numérique
k2 = addCalc('k2', '(12-2*sqrt(3))/11') #idem
ang60 = addCalc('ang60', '60') #idem

def cerclesTangents(O, A, prof):
  ce = addCircleOA(O, A)
  col = color(prof)
  addSurface(ce, col)
  P = addImPointRotation(A, O, ang60)
  setHidden(P)
  B = addImPointRotation(P, O, ang60)
  setHidden(B)
  Q = addImPointRotation(B, O, ang60)
  setHidden(Q)
  C = addImPointRotation(Q, O, ang60)
  setHidden(C)
  R = addImPointRotation(C, O, ang60)
  setHidden(R)
  I = addImPointDilation(A, O, k1)
  setHidden(I)
  E = addImPointDilation(P, O, k2)
  setHidden(E)
  J = addImPointDilation(B, O, k1)
  setHidden(J)
  F = addImPointDilation(Q, O, k2)
  setHidden(F)
  K = addImPointDilation(C, O, k1)
  setHidden(K)
  G = addImPointDilation(R, O, k2)
  setHidden(G)
  c1 = addCircleOA(I, A)
  c2 = addCircleOA(E, P)
  c3 = addCircleOA(J, B)
  c4 = addCircleOA(F, Q)
  c5 = addCircleOA(K, C)
  c6 = addCircleOA(G, R)
  col = color(prof - 1)
  addSurface(c1, col)
  addSurface(c2, col)
  addSurface(c3, col)
  addSurface(c4, col)
  addSurface(c5, col)
  addSurface(c6, col)
 
  if (prof > 0):
      cerclesTangents(I, A, prof - 1)
      cerclesTangents(J, B, prof - 1)
      cerclesTangents(K, C, prof - 1)
      cerclesTangents(E, P, prof - 1)
      cerclesTangents(F, Q, prof - 1)
      cerclesTangents(G, R, prof - 1)

O1 = addFreePoint({'absCoord': True, 'x': width/2, 'y': height/2, 'name': 'Ω'})
A = addFreePoint({'absCoord': True, 'x': width/2, 'y': 40, 'name': 'A'})
setPointNameOffset(A, 0, -25) # ON décale le nom le décalage est donné en coordonnées SVG
cerclesTangents(O1, A, profmax)
addZoomButtons(1.1)

Une dernière remarque :

On peut remplacer les 3 lignes de codes suivantes :

k1 = addCalc('k1', '4-2*sqrt(3)') #PLus rapide à la création de passer un objet calcul MathGraph32 plutôt qu'une valeur numérique
k2 = addCalc('k2', '(12-2*sqrt(3))/11') #idem
ang60 = addCalc('ang60', '60') #idem

par celles-ci (à condition d’ajouter une ligne import math au début) :

k1 = 4-2*math.sqrt(3)
k2 = (12-2*math.sqrt(3))/11')
ang60 = 60

Mais l’exécution de ce code générera une figure nécessitant plus de mémoire car alors, par exemple, chaque ligne I = addImPointDilation(A, O, k1) devra recréer un calcul MathGraph32 de valeur k1 alors que, dans la première version du code, chaque appel de la ligne I = addImPointDilation(A, O, k1) utilisera pour k1 un objet MathGraph32 déjà défini.