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

Accueil Tutoriels Exemples guidés

Una gran novedad : Programar en Python una figura MathGraph32

modification vendredi 30 mars 2024.

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



La nueva versión 7.9.1 ahora permite crear objetos en una figura en lenguaje Python.

Para mostrar el poder de esta nueva funcionalidad, mostraremos dos ejemplos a continuación.

Próximamente aparecerán otros artículos explicativos.

Tenga en cuenta que encima de la ventana para ingresar el código Python tiene un enlace sobre la palabra documentación que direcciona a la ayuda de la API de MathGraph32 (sintaxis).

Primer ejemplo básico : copie y pegue el código Python a continuación en el cuadro sobre fondo negro (código Python) y luego haga clic en el botón Ejecutar debajo de este cuadro de edición :

from mathgraph import *
# no modifique la línea de arriba
# para poder utilizar las funciones mathgraph, por ejemplo
# A = addPointXY(3, 3, 'A')
A = addPointXY(-5, 4, 'A') # Equivalente a 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)

Tenga en cuenta que se supone que este código se ejecuta en una figura provista de un referencial, como es el caso aquí (pero puede cambiar el tipo de figura en la cual se ejecuta el código en la lista desplegable debajo de la figura).

También tenga en cuenta que en la línea B = addFreePoint(6, -3, ’B’), las coordenadas 6 y -3 se utilizan para dar la posición del punto libre B pero luego puede capturarlo con el mouse (el punto B no está ligado al referencial).

Notará que la figura es dinámica : cuando capture B, la circunferencia de centro C y radio AB*sqrt(2)/2 se vuelve a dibujar dinámicamente. Esto se debe a que la línea AB = addLengthMeasure(A, B) creó una medida de la longitud AB en MathGraph32 y por lo tanto podemos usar esta fórmula en el radio de la circunferencia siguiente, dado por la fórmula ’AB* sqrt(2)/2’.

Encontrará otro ejemplo más sofisticado al final de esta página.

Una vez ejecutada la figura, los botones debajo de la figura le permiten :

- ya sea recuperar el código Base 64 de la figura (botón Copiar el código de la figura)

- ya sea guardar la figura obtenida en un archivo con el sufijo mgj (botón Descargar la figura), es decir un archivo de figura MathGraph32 (recomendado para figuras muy grandes como la del ejemplo al final de esta página).

Luego puede abrir la figura generada con el software MathGraph32.

Aquí hay otro ejemplo de código más sofisticado que creará recursivamente circunferencias anidadas dentro de un primera circunferencia (copie el código a continuación en el portapapeles, péguelo en el editor de código Python y luego haga clic en el botón Ejecutar).

Tenga en cuenta que la figura obtenida es dinámica : puede capturar el punto A. Luego puede reemplazar profmax = 3 por profmax = 4. Más allá de eso, la figura contiene demasiados objetos (limitados a 250.000). Con profmax = 4, el número de objetos creados ya ronda alrededor de los 56.000 (y en cada nivel superior el número se multiplica por 6).

El código Python para copiar en la ventana de edición de código :

from mathgraph import *
# No sobrepasar 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)') #Más rápido de crear para pasar un objeto de cálculo MathGraph32 en lugar de un valor numérico
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) # Cambiamos el nombre, el desplazamiento se da en coordenadas SVG
cerclesTangents(O1, A, profmax)
addZoomButtons(1.1)

Una nota final :

Podemos reemplazar las siguientes 3 líneas de código :

k1 = addCalc('k1', '4-2*sqrt(3)') #Más rápido de crear para pasar un objeto de cálculo MathGraph32 en lugar de un valor numérico
k2 = addCalc('k2', '(12-2*sqrt(3))/11') #idem
ang60 = addCalc('ang60', '60') #idem

por estos (siempre que agregue una línea import math al comienzo) :

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

Pero la ejecución de este código generará una figura que requerirá más memoria porque entonces, por ejemplo, cada línea I = addImPointDilation(A, O, k1) tendrá que recrear un cálculo MathGraph32 de valor k1 mientras que, en la primera versión del código, cada llamada a la línea I = addImPointDilation(A, O, k1) utilizará un objeto MathGraph32 ya definido para k1.