geoPyX est un module écrit en Python pour construire des figures géométriques aisément. Il utilise le package PyX , mais en simplifie beaucoup la syntaxe. Vous pouvez ainsi sauvegarder vos figures sous différents formats : EPS, PDF et PNG pour le Web (Dans ce cas, il est nécessaire d'avoir installé ImageMagick sur votre machine).
J'ai commencé geoPyX en Aôut 2006, car j'étais frustré par la gestion dynamique des labels sous MetaPost et de la pauvreté des boucles dans PSTricks. Le package PyX permet un accès simultané aux language Adobe PostScript et LaTeX aux utilistaeurs de Python. geoPyX est encore très jeune et peut encore contenir certains bugs, aussi utilisez-le à vos risques et périls !
La version 2.0 apporte beaucoup de nouveautés, mais n'est pour l'instant pas aussi évoluée que l'était la première.
Au niveau des nouvelles fonctionnalités, il faut noter une syntaxe beaucoup plus souple et cohérente. Ainsi, si précédemment on avait ceci dans le code source (un triangle avec un label et une cote de longueur):
#!/usr/bin/env python # -*- coding: Latin-1 -*- from geopyx import * f = Figure( -2,-2,11,10 ) A = Point(0,0) B = Point(10,0) C = Point(10,3.3) f.trace( Triangle.Pt(A,B,C) ) cotation( f, A, M, -0.5, 0.05, r'$45$' ) Label.Pt( f, A, r'$A$ ', angle='sw' ) f.end( 'test1' )
Deviendra maintenant ceci :
#!/usr/bin/env python # -*- coding: Latin-1 -*- from geopyx import * f = Figure( -2,-2,11,10 ) A = Point(0,0) B = Point(10,0) C = Point(10,3.3) f.add( Triangle.Pt(A,B,C) ) f.add( Cotation( f, A, M, -0.5, 0.05, r'$45$' ) ) f.add( Label.Pt( f, A, r'$A$ ', angle='sw' )) f.trace() f.end( 'test1' )
Le nombre de parenthèses augmente donc un petit peu, mais c'est un gain dans la syntaxe qui était visé avant tout.
Sur cette nouvelle version, voici les primitives implémentées données sous leur forme Française, puis Anglaise (qui correspond à l'utilisation réelle), suivi de leur hierarchie:
Quelques facilités ont aussi été incorporées pour :
La prochaine version comportera des classes pour :
Il est enfin prévu de développer :
Pour faire fonctionner geoPyX, vous aurez besoin de :
Ils vont venir au fûr et à mesure de l'avancement du projet, soyez patients.
18 Janvier 2007 : La Classe Segment et ses dérivées Line et Ray disposent maintenant de constructions un peu plus "naturelles", par l'intermédiaire de la méthode de classe Pt. C'est à dire qu'on peut dorénavant construire une droite par l'intermédiaire de deux Points ou d'un Point et d'un Vector. Cela aurait dû être fait depuis longtemps, mais c'est seulement aujourd'hui que j'ai constaté ce manque car j'en avais besoin pour produire une figure. Autrement, je commence tout juste un modèle sur la 3d, je manque de références à ce sujet et je vais donc chercher à en savoir davantage.
15 Janvier 2007 : Ajout des boxLabels et améliorations des Labels qui sont maintenant transformables à souhait.
04 Janvier 2007 : J'ai commencé à écrire de nouveau cette page pour l'actualiser, il restait trop de codes sources de l'ancienne syntaxe et les miniatures générées n'avaient pas toutes la même taille, ce qui était esthétiquement gênant.
03 Janvier 2007 : La version geoPyX v2.0 Beta voit le jour : geoPyXv2.
Voici un aperçu de la syntaxe générale d'un exemple, l'image générée correspont à la première parmi les cinq qui suivent:
#! /usr/bin/env python # -*- coding: iso-8859-1 -*- from geopyx import * pyx.unit.set(uscale=1.5) # zoomin by 150% f = Figure(-8,-8,8,8) p = Point(6,4) q = Point(3,-2) r = Point(1,1) t1 = Triangle.Pt(p,q,r) t2 = t1.rotated(0,0,180) [p1,q1,r1] = t2.coord_list pto = Point.Middle(p,p1) f.add(t1, filled='grey9') f.add(t2, filled='grey6') for pt in t1.coord_list + t2.coord_list: f.add( symbCircle.Pt(pt), filled ='yellow') f.add( Segment.Pt(pt, pt.sympt(0,0)), col='red', st='dd') f.add( codeSegments(pto,p,pto,p1,tn=3), col='red' ) f.add( codeSegments(pto,q,pto,q1,tn=2,angle=-45), col='red' ) f.add( codeSegments(pto,r,pto,r1,tn=1), col='red' ) f.add( Label.Pt(p, r"$P$", angle='n' ) ) f.add( Label.Pt(q, r"$Q$", angle='se' ) ) f.add( Label.Pt(r, r"$R$", angle='w' ) ) f.add( Label.Pt(p1, r"$P'$", angle='s' ) ) f.add( Label.Pt(q1, r"$Q'$", angle='n' ) ) f.add( Label.Pt(r1, r"$R'$", angle='se' ) ) f.add( Label.Pt(pto, r"$O$", angle='n' ) ) f.add( Label(0,-5,r"Central~Symetry")) f.trace() f.end('centralsym', png='True')
Et voici les rendus obtenus (j'ai illustré ici différentes transformations, étudiées en collège ou en lycée), tous transformés en PNG pour afficher cette page :
Les transformations affines en actions (qui peuvent être enchaînées):
Quelques variations sur les triangles, avec un peu de couleur, voire de transparence dans certains cas:
Des travaux sur les parallelogrammes et les translations
Quelques fonctions et la nouvelle classe boxedLabel
Un exemple beaucoup plus complexe : j'ai été forcé ici d'utiliser les possibilités de PyX à l'intérieur du script geoPyX
Les boxedLabels sont des boites de textes auxquelles on peut appliquer différentes transformations affines.
Dernière version : geoPyXv2 (15 Janvier 2007)
La documentation doit encore être écrite. Elle sera disponible en différents formats (LaTeX, OpenOffice, CHM, etc.), conséquence de l'utilisation du package reST.
Je suis tout à fait conscient des limitations que peut apporter geoPyX pour l'instant, néanmoins, c'est un moyen efficace, clair et rapide pour créer des figures géométriques "simples". Pour des schémas plus complexes, il faudra mettre les mains dans le cambouis et utiliser toutes les possibilités de PyX. Mais rassurez-vous, elles sont énormes !