I. Installation▲
Tout d'abord, une distribution kitxmlcodeinlinelatexdvp\rm\LaTeXfinkitxmlcodeinlinelatexdvp minimale doit être installée. Asymptote fait partie des principales distributions kitxmlcodeinlinelatexdvp\mathrm{\LaTeX}finkitxmlcodeinlinelatexdvp.
Pour savoir si Asymptote est installé, taper asy dans un terminal, vous verrez apparaître le numéro de version si c'est le cas. Taper quit pour sortir du mode interactif.
Sinon, il faut l'installer.
Ensuite, je ne traiterai pas l'installation sur Microsoft Windows ou MacOS X, ne connaissant pas (ou plus) ces systèmes. Vous trouverez tous les renseignements dans la documentation officielle, ou sur asymptote.sourceforge.net.
Sur Unix, il existe un paquet Asymptote sur la plupart des distributions, à installer par votre gestionnaire de paquets, mais cette version est parfois loin d'être à jour…
Pour avoir une version récente du logiciel, une compilation des sources pour installer la version svn est un bon choix.
Voici comment faire sur (X)Ubuntu 14.04.
Attention, il faut désinstaller toute version préalablement installée.
Si Asymptote a été installé en même temps que TeX Live, par le script install-tl par exemple, il faut le supprimer à l'aide de tlmgr :
sudo tlmgr remove --force asymptote-
Les paquets nécessaires
Sélectionnezsudo apt-get install build-essential subversion flex texinfo autoconf zlib1g-dev bison freeglut3-dev cdbs libfftw3-dev libreadline6-dev libncurses5-dev libgsl0-dev libsigsegv-dev imagemagick libosmesa6-dev -
Récupérer les sources
Sélectionnezmkdir asymptote_svn cd asymptote_svn svn co http://svn.code.sf.net/p/asymptote/code/trunk/asymptote -
Compiler
Sélectionnezcd asymptote ./autogen.sh wget http://hboehm.info/gc/gc_source/gc-7.4.0.tar.gz wget http://hboehm.info/gc/gc_source/libatomic_ops-7.4.0.tar.gz ./configure make all sudo make install - Pour les mises à jour, c'est
cd asymptote_svn/asymptote
svn update
sudo make installRemarques :
Si vous êtes sous Gnome, vous avez l'éditeur de texte Gedit déjà installé. Vous trouverez tout ce qu'il faut pour l'utiliser avec Asymptote à cette adresse : cgmaths.fr/Atelier/Asymptote/OutilsGedit.html.
Un équivalent sur Windows est Notepad++, pour son utilisation, vous pouvez vous rendre dans la rubrique « Installation d'Asymptote » sur le forum asy.gmaths.net/forum.
II. Les différentes compilations▲
II-A. Options de compilation▲
Les options de compilation sont très nombreuses (voir la documentation officielle). Nous ne nous intéresserons ici qu'à quelques-unes.
Créez un fichier texte,nommez-le exemple.asy et collez-y un des codes d'exemple ci-après (pas le premier !). Enregistrez le document.
La compilation de ce code se fait en ligne de commande, avec les options par défaut, par
asy exemple.asyQuelques options intéressantes :
-V : utile notamment pour les figures 3D, la figure s'ouvre dans une fenêtre de rendu OpenGL. La figure est alors manipulable, et un double-clique droit permet d'accéder à différents paramètres ;
-noV : pour que le PDF (ou eps, ou autre) soit créé directement. ;
-f : pour préciser le format de sortie (PDF…). Équivalent à settings.outformat='pdf'; (ou autre) dans le code de la figure ;
-prc : pour les figures 3D : format prc d'Adobe dans le PDF. Le PDF ne sera visualisable qu'avec une version suffisamment récente d'Acrobat Reader. La figure sera manipulable et on aura accès à un menu 3D ;
-noprc : pas de format prc. La figure peut être visualisée dans n'importe quel lecteur PDF. Équivalent à settings.prc=false; dans le code de la figure ;
-render n : rendu des figures 3D (n pixels/bp). Équivalent à settings.render=n; dans le code de la figure.
Exemple de compilation
asy -noV -noprc -f pdf exemple.asyLa figure produite peut être incluse dans un document .tex par un \includegraphics.
II-B. Compilation à l'intérieur d'un fichier .tex▲
Il sera vu le minimum ici. Pour davantage d'explications, voir la documentation officielle.
- Méthode « classique »
Il faut ajouter au début du document la ligne : \usepackage{asymptote}
Le code de la figure doit être compris entre les balises \begin{asy} et \end{asy}.
\begin{asy}[width=\the\linewidth,inline=true]
…
\end{asy}- Ci-dessus sont précisées en options la largeur et inline=true qui permet d'utiliser des symboles kitxmlcodeinlinelatexdvp\rm\LaTeXfinkitxmlcodeinlinelatexdvp définis en dehors de l'environnement asy.
La compilation se fait en trois temps :
- Une compilation latex (ou pdflatex). Un fichier .asy par figure est créé ;Une compilation asy.
-
Pour compiler toutes les figures, si le fichier tex s'appelle exemple.tex :
Sélectionnezasy exemple-*.asyLes figures sont créées au format eps pour une compilation kitxmlcodeinlinelatexdvp\rm\LaTeXfinkitxmlcodeinlinelatexdvp, ou au format PDF pour une compilation pdflatex ;
- Une nouvelle compilation latex (ou pdflatex).
- Latexmk
Toutefois, il est dorénavant possible de tout compiler en une fois grâce à une version suffisamment récente du script latexmk. Ce script est peut-être déjà installé sur votre distribution ou alors il est téléchargeable sur le CTAN : www.ctan.org/tex-archive/support/latexmk/.
Une fois installé, il faut créer un fichier nommé latexmkrc contenant :
sub asy {return system("asy '$_[0]'");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");Ce fichier peut être placé dans le même répertoire que le fichier tex.Note : sur linux, placer ce fichier une fois pour toutes dans le répertoire personnel en le nommant « latexmkrc ».
Attention, perl doit être installé sur l'ordinateur.
Ensuite une seule compilation suffit :
latexmk -pdf exemple.texcréera un PDF (seules les figures ayant été modifiées depuis la dernière compilation seront compilées).
Remarque :Pour que les figures soient créées dans un sous-dossier figures, il faut ajouter dans le préambule du document tex :
\def\asydir{figures}et remplacer la première ligne du fichier latexmkrc par : sub asy {return system("asy -o figures/ '$_[0]'");}
- Package asypictureB
Nouveau package, très bon substitut à latexmk, mais ne fonctionne pas (encore) pour la 3D. Il suffit de l'importer dans le préambule à la place du package asymptote. Une seule compilation suffit : www.ctan.org/pkg/asypictureb.
III. Quelques généralités▲
Une bonne partie de la documentation officielle sera reprise ici. Les exemples de cette partie pourront être compilés simplement par : asy mafigure.asy (pour de l'eps) ou asy -f pdf mafigure.asy (pour du PDF).
III-A. Unités, dimensions de la figure▲
Contrairement à des logiciels comme GeoGebra, on ne peut pas placer de points « au hasard », tout se passe dans un repère : les points sont placés par leurs coordonnées. Ces coordonnées, appelées pairs sont en « big points » PostScript (1 bp = 1/72 inch).
Ainsi, avec le code 1, on ne verra rien ! la figure étant beaucoup trop petite…
Les codes 2 et 3 produiront la même figure, à savoir un segment de longueur kitxmlcodeinlinelatexdvp2\sqrt{2}\ \mathrm{cm}.finkitxmlcodeinlinelatexdvp
|
Code 1 Sélectionnez |
Code 2 Sélectionnez |
Code 3 Sélectionnez |
Remarques :
- L'« unité » peut être différente pour les abscisses et les ordonnées : unitsize(1cm,1.5cm);
- On peut aussi spécifier la taille finale de la figure produite :
Pour une figure de 3 cm de largeur, on précisera : size(3cm,0); (0 pour ne pas avoir à spécifier la hauteur, la mise à l'échelle étant automatique.)La taille peut être spécifiée en bp, pt, cm, mm ou inches. - -- est un connecteur qui joint les points par un segment. Les autres connecteurs sont .. , :: et --- (voir la documentation officielle).
|
|
|
|
Code 4 Sélectionnez |
Code 5 Sélectionnez |
III-B. Quelques commandes de dessin▲
- draw
void draw(picture pic=currentpicture, Label L="", path g,
align align=NoAlign, pen p=currentpen,
arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin,
Label legend="", marker marker=nomarker)Voyons en détail quelques options (pour les autres, voir la documentation officielle) :
- picture pic=currentpicture : dessine dans l'image pic, par défaut currentpicture ;
- Label L="" : permet de placer un texte ;
- path g : le chemin à dessiner ;
- pen p=currentpen : le stylo à utiliser ;
- arrowbar arrow=None : les flèches. Les valeurs possibles sont : None, Blank, BeginArrow, MidArrow, Arrow, et Arrows (flèches aux deux extrémités). On peut de plus préciser le type de tête (DefaultHead, SimpleHead, HookHead, TeXHead), la taille, l'angle de la tête, le type de remplissage (FillDraw, Fill, NoFill, UnFill, Draw) et la position relative.
Il y a aussi certaines versions modifiées (taille et angle) : BeginArcArrow, MidArcArrow, ArcArrow, et ArcArrows ; -
arrowbar bar=None : les barres aux extrémités. Les valeurs possibles sont : None, BeginBar, Bar et Bars. On peut préciser la taille.
Code 6Sélectionnezsize(5cm,0);pathchemin=(0,0)..(1,.5)..(2,0)..(3,.5);draw("Chemin",chemin,blue,Arrow);draw(shift(0,-.6)*chemin,green,BeginArrow(5mm,Draw),Bar);draw(shift(0,-1.2)*chemin,.8*red,Arrows(TeXHead));draw(shift(0,-1.8)*chemin,bp+magenta,MidArrow(HookHead,Fill(blue)),Bars(2mm)); -
fill
Sélectionnezvoidfill(picturepic=currentpicture,pathg,penp=currentpen)voidfilldraw(picturepic=currentpicture,pathg,penfillpen=currentpen,pendrawpen=currentpen)Ces deux fonctions servent à remplir les chemins cycliques :
Code 7Sélectionnezsize(5cm,0);pathrec=(0,0)--(1,0)--(1,.5)--(0,.5)--cycle;fill(rec,lightyellow);Code 8Sélectionnezsize(5cm,0);pathr=(0,0)--(1,0)--(1,.5)--(0,.5)--cycle;filldraw(r,fillpen=lightyellow, drawpen=2bp+.8green); - label
void label(picture pic=currentpicture, Label L, pair position,
align align=NoAlign, pen p=nullpen, filltype filltype=NoFill)Cette fonction permet de placer un texte au point de coordonnées position. Le texte peut être une simple chaîne de caractères (respectant la syntaxe kitxmlcodeinlinelatexdvp\rm\LaTeXfinkitxmlcodeinlinelatexdvp) ou une structure plus complexe obtenue par une fonction du type (il y en a d'autres, voir la documentation officielle) :
Label Label(string s="", pair position, align align=NoAlign,
pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill)align peut prendre n'importe quel pair comme valeurs. Certaines sont prédéfinies : N, S, E, W, NE, NW, SE, SW, LeftSide, RightSide, Center.
Voir les exemples qui suivent pour les différents paramètres.
|
|
|
|
|
Code 9 Sélectionnez |
Code 10 Sélectionnez |
Code 11 Sélectionnez |
|
|
|
|
|
Code 12 Sélectionnez |
Code 13 Sélectionnez |
Code 14 Sélectionnez |
|
|
|
|
|
Code 15 Sélectionnez |
Code 16 Sélectionnez |
Code 17 Sélectionnez |
Remarque
Dans les exemples, B-A peut être interprété comme le vecteur AB.
On peut réaliser différentes opérations sur les pairs. Par exemple pair I=(A+B)/2; donnera le milieu I de [AB] (équivalent à pair I=midpoint(A—B);).
IV. Transformations▲
Présentation rapide des transformations d'Asymptote. Pour la première, pas besoin de figure : transform identity();
Ensuite :
transform shift(pair z);
transform shift(real x,real y);|
|
|
|
Code 18 Sélectionnez |
Code 19 Sélectionnez |
|
Sélectionnez |
Sélectionnez |
|
|
|
|
Code 20 Sélectionnez |
Code 21 Sélectionnez |
|
Sélectionnez envoie le pair (x,y) sur (x+s*y,y) |
Sélectionnez |
|
|
|
|
Code 22 Sélectionnez |
Code 23 Sélectionnez |
|
Sélectionnez |
|
|
|
Code 24 Sélectionnez |
V. Quelques figures basiques▲
Voici quelques figures permettant de parcourir une partie des outils de base d'Asymptote.
|
|
|
|
Code 25 Sélectionnez |
Code 26 Sélectionnez |
|
|
|
Code 27 Sélectionnez |
|
|
|
Code 28 Sélectionnez |
|
|
|
Code 29 Sélectionnez |
|
|
|
Code 30 Sélectionnez |
|
|
|
Code 31 Sélectionnez |
|
|
|
Code 32 Sélectionnez |
|
|
|
Code 33 Sélectionnez |
VI. Quelques modules▲
Je ne présenterai ici que les modules que j'utilise et donc, que je connais un peu…
Pour les autres (graph3, grid3, interpolate, etc.), voir la documentation officielle, et les galeries d'exemples (asymptote.sourceforge.net).
VI-A. markers▲
Le module markers fournit tout ce qu'il faut pour marquer segments et angles.
Les marqueurs pour les segments sont :
marker StickIntervalMarker(int i=2, int n=1, real size=0, real space=0,
real angle=0, pair offset=0, bool rotated=true,
pen p=currentpen, frame uniform=newframe,
bool above=true)|
|
|
|
Code 34 Sélectionnez |
Code 35 Sélectionnez |
marker CrossIntervalMarker(int i=2, int n=3, real size=0, real space=0,
real angle=0, pair offset=0, bool rotated=true,
pen p=currentpen, frame uniform=newframe,
bool above=true)|
|
|
|
Code 36 Sélectionnez |
Code 37 Sélectionnez |
marker CircleBarIntervalMarker(int i=2, int n=1, real barsize=0, real radius=0,
real angle=0, pair offset=0, bool rotated=true,
pen p=currentpen, filltype filltype=NoFill,
bool circleabove=false, frame uniform=newframe,
bool above=true)|
|
|
|
Code 38 Sélectionnez |
Code 39 Sélectionnez |
|
|
|
|
Code 40 Sélectionnez |
Code 41 Sélectionnez |
marker TildeIntervalMarker(int i=2, int n=1, real size=0, real space=0,
real angle=0, pair offset=0, bool rotated=true,
pen p=currentpen, frame uniform=newframe,
bool above=true)|
|
|
|
Code 42 Sélectionnez |
Code 43 Sélectionnez |
Il est bien sûr possible de définir ses propres « markers » :
|
|
|
Code 44 Sélectionnez |
Les marques prédéfinies sont :
frame stickframe(int n=1, real size=0, pair space=0, real angle=0,
pair offset=0, pen p=currentpen)
frame circlebarframe(int n=1, real barsize=0,
real radius=0,real angle=0,
pair offset=0, pen p=currentpen,
filltype filltype=NoFill, bool above=false) above=false)
frame crossframe(int n=3, real size=0, pair space=0,
real angle=0, pair offset=0, pen p=currentpen)
frame tildeframe(int n=1, real size=0, pair space=0,
real angle=0, pair offset=0, pen p=currentpen)Pour marquer l'angle AOB (dans le sens direct), on dispose de :
void markangle(picture pic=currentpicture, Label L="",
int n=1, real radius=0, real space=0,
pair A, pair O, pair B, arrowbar arrow=None,
pen p=currentpen, filltype filltype=NoFill,
margin margin=NoMargin, marker marker=nomarker)|
|
|
|
Code 45 Sélectionnez |
Code 46 Sélectionnez |
VI-B. geometry▲
Ce module apporte un grand nombre d'outils permettant de faciliter la construction de figures géométriques dans le plan.
Une fois n'est pas coutume, il y a une vraie documentation en français, faite par l'auteur du module : Philippe Ivaldi. On la trouve ici : www.piprime.fr/files/res/geometry_fr.pdf
Elle est extrêmement complète. Il existe de plus un index à cette adresse : www.piprime.fr/files/asymptote/geometry/modules/geometry.asy.index.type.html
Ce qui suit n'est ni plus ni moins qu'un copié-collé d'une toute petite partie de cette documentation dont la lecture est essentielle.
VI-B-1. De nouveaux types d'objets sont définis ▲
coordsys: permet d'utiliser n'importe quel repère cartésien.point: équivalent au type pair dans le repère par défaut.vector: aussi équivalent au type pair dans le repère par défaut.mass: pour les barycentres.line: quelques objets de type line :lineline(pointA,boolextendA=true,pointB,boolextendB=true)
Pour les droites, demi-droites (extendA=false ou extendB=false) et segments de droites (extendA=false et extendB=false).lineline(coordsysR=currentcoordsys,reala,realb,realc)
Renvoie la droite d'équationkitxmlcodeinlinelatexdvpax+by +c = 0finkitxmlcodeinlinelatexdvp dans le repère R.lineline(coordsysR=currentcoordsys,realslope,realorigin)
Renvoie la droite de pente slope et d'ordonnée à l'origine origin données relativement au repère R.
line parallel(point M, line l)
Renvoie la droite parallèle à l passant par M.lineparallel(pointM,explicitvectordir)
Renvoie la droite de vecteur directeur dir et passant par M.lineparallel(pointM,explicitpairdir)
Renvoie la droite de vecteur directeur dir donné dans le repère courant currentcoordsys et passant par M.lineline(reala,pointA=point(currentcoordsys,(0,0)))
Renvoie la droite passant par A et faisant un angle de a degrés avec l'axe des abscisses du repère dans lequel est défini A.linebisector(linel1,linel2,realangle=0,boolsharp=true)
Renvoie l'image de la bissectrice de l'angle formé par les droites orientées l1 et l2 par la rotation de centre « l'intersection de l1 et l2 » et d'angle angle. Si le paramètre sharp vaut true, renvoie la bissectrice de l'angle aigu.linesector(intn=2,intp=1,linel1,linel2,realangle=0,boolsharp=true)
Renvoie l'image de la p-ième droite qui partage l'angle formé par les droites orientées l1 et l2 en n parties égales par la rotation de centre « l'intersection de l1 et l2 » et d'angle angle. Si le paramètre sharp vaut true, considère l'angle aigu.lineperpendicular(pointM,linel)
Renvoie la droite perpendiculaire à l passant par M.lineperpendicular(pointM,explicitvectornormal)
Renvoie la droite passant par M et de vecteur normal normal.lineperpendicular(pointM,explicitpairnormal)
Renvoie la droite passant par M et de vecteur normal normal donné dans le repère courantcurrentcoordsys.linereverse(linel)
Renvoie la droite représentée par l avec une orientation contraire à celle de l.lineextend(linel)
Renvoie la droite portée par l qui peut être une demi-droite ou un segment de droite.linecomplementary(explicitlinel)
Renvoie la demi-droite complémentaire de l. Ne fonctionne que si l représente effectivement une demi-droite.- Segment :
segmentsegment(pointA,pointB)
On notera notamment la routine :linebisector(segments,realangle=0)
qui renvoie l'image de la médiatrice de s par la rotation de centre « le milieu de s » et d'angle angle.
Ainsi que :line[]complementary(explicitsegments)
qui renvoie sous forme de tableau les deux demi-droites de support s et d'extrémités respectives s.A et s.B. - conic : pour une conique quelconque non dégénérée. Les types dérivés sont : circle, ellipse, parabola et hyperbola.
De nombreuses routines permettent de définir un cercle. Entre autres :circlecircle(explicitpointC,realr)
Renvoie le cercle de centre C et de rayon r.circlecircle(pointA,pointB)
Renvoie le cercle de diamètre AB.circlecircle(pointA,pointB,pointC)
Renvoie le cercle passant par les points distincts A, B et C.
Etc. (Voir la documentation.) - arc : pour les arcs orientés d'ellipses.
arcarc(ellipseel,realangle1,realangle2,polarconicroutine polarconicroutine=polarconicroutine(el),booldirection=CCW) - abscissa : pour instancier une abscisse sur un objet de type line, segment, conic et arc.
-
triangle: structure assez complexe bénéficiant de nombreuses routines. Encore une fois, le minimum sera vu. Ici, la lecture de la documentation est essentielle.Sélectionnezstructtriangle{restrictedpointA, B, C;// points marquant les sommets du trianglestructvertex{// sommet de triangleintn;trianglet; }restrictedvertexVA, VB, VC;// les sommets du trianglestructside{// côté de triangleintn;trianglet; }sideAB, BC, CA, BA, AC, CB;// les côtés du triangle}Sélectionnezvoidlabel(picturepic=currentpicture,LabelLA="$A$",LabelLB="$B$",LabelLC="$C$",trianglet,realalignAngle=0,realalignFactor=1,penp=nullpen,filltypefilltype=NoFill) -
Place les labels LA, LB et LC aux sommets du triangle t, alignés suivant la première bissectrice du sommet correspondant.
Les paramètres alignAngle et alignFactor permettent de modifier la direction et la longueur de l'alignement.Sélectionnezvoidshow(picturepic=currentpicture,LabelLA="$A$",LabelLB="$B$",LabelLC="$C$",LabelLa="$a$",LabelLb="$b$",LabelLc="$c$",trianglet,penp=currentpen,filltypefilltype=NoFill) -
Trace le triangle t et affiche les labels aux sommets du triangle ainsi que les longueurs de ses côtés. Cette routine est surtout utile pour localiser les sommets t.A, t.B et t.C en cours de codage.Sélectionnezvoiddraw(picturepic=currentpicture,trianglet,penp=currentpen,markermarker=nomarker) -
Trace le triangle t ; les côtés sont tracés comme des segments.
voiddrawline(picturepic=currentpicture,trianglet,penp=currentpen)
Trace le triangle t ; les côtés sont tracés comme des droites.triangletriangle(pointA,pointB,pointC)
Renvoie le triangle dont les sommets sont A, B et C.triangletriangleabc(reala,realb,realc,realangle=0,pointA=(0,0))
Retourne le triangle ABC tel que BC=a, AC=b, AB=c ettriangletriangleAbc(realalpha,realb,realc,realangle=0,pointA=(0,0))
Retourne le triangle ABC tel que kitxmlcodeinlinelatexdvp\left(\vec{AB};\vec{AC}\right)= \mathrm{alpha}finkitxmlcodeinlinelatexdvp, AC=b, AB=c et kitxmlcodeinlinelatexdvp\left(\vec{\imath};\vec{AB}\right)= \mathrm{angle}.finkitxmlcodeinlinelatexdvptriangletriangle(linel1,linel2,linel3)
Renvoie le triangle dont les côtés sont l1, l2 et l3.
Et de nombreuses autres routines permettant de tracer l'orthocentre, les hauteurs, le centre de gravité, les médianes, etc. -
trilinear: instancie des coordonnées trilinéaires relatives à un triangle (sic). inversion: permet d'instancier l'inversion de pôle C et de puissance k.
struct inversion
{
point C;
real k;
}VI-B-2. De nouvelles transformations sont définies ▲
transform scale(real k, point M)
Homothétie de centre M et de rapport k.
transform scale(real k, line l1, line l2, bool safe=false)
Renvoie l'affinité de rapport k, d'axe l1 et de direction l2.
Si safe vaut true et l1 parallèle à l2, la routine renvoie l'identité.
transform projection(point A, point B)
Projection orthogonale sur la droite (AB).
transform projection(line l)
Renvoie la projection orthogonale sur l.
transform projection(point A, point B, point C, point D, bool safe=false)
Projection sur la droite (AB) parallèlement à (CD).
Si safe vaut true et (AB) est parallèle à (CD), l'identité est renvoyée.
Si safe vaut false et (AB) est parallèle à (CD), l'homothétie de centre O et de rapport infini est renvoyée.
transform projection(line l1, line l2, bool safe=false)
Renvoie la projection sur l1 parallèlement à l2.
Si safe vaut true et l1 parallèle à l2, la routine renvoie l'identité.
transform vprojection(line l, bool safe=false)
Renvoie la projection sur l parallèlement à la verticale.
Si safe vaut true et l est une droite verticale, la routine renvoie l'identité.
transform hprojection(line l, bool safe=false)
Renvoie la projection sur l parallèlement à l'horizontale.
Si safe vaut true et l est une droite horizontale, la routine renvoie l'identité.
transform scale(real k, point A, point B, point C, point D, bool safe=false)
Affinité de rapport k, d'axe (AB) et de direction (CD). Si safe vaut true et (AB) est parallèle à (CD), l'identité est renvoyée.
Si safe vaut false et (AB) est parallèle à (CD), l'homothétie de centre O et de rapport infini est renvoyée.
transform xscale(real k, point M)
Affinité de rapport k, d'axe « l'axe passant par M et parallèle à (Oy) » et de direction (Ox).
transform yscale(real k, point M)
Affinité de rapport k, d'axe « l'axe passant par M et parallèle à (Ox) » et de direction (Oy).
transform scaleO(real x)
Homothétie de rapport x et de centre « l'origine du repère courant ». Cette transformation est identique à scale(x, origin()).
transform xscaleO(real x)
Identique à xscale(x, origin()).
transform yscaleO(real x)
Identique à yscale(x, origin()).
transform rotateO(real angle)
Identique à rotate(angle, origin()).
transform reflect(line l)
Renvoie la réflexion par rapport à l.
VI-B-3. geometry introduit aussi des fonctions de marquage ▲
void distance(picture pic=currentpicture, Label L="", point A, point B,
bool rotated=true, real offset=3mm,
pen p=currentpen, pen joinpen=invisible,
arrowbar arrow=Arrows(NoFill))
void markrightangle(picture pic=currentpicture, point A, point O,
point B, real size=0, pen p=currentpen,
margin margin=NoMargin,
filltype filltype=NoFill)
void perpendicularmark(picture pic=currentpicture, point z,
explicit pair align,
explicit pair dir=E, real size=0,
pen p=currentpen,
margin margin=NoMargin,
filltype filltype=NoFill)
void perpendicularmark(picture pic=currentpicture, point z,
vector align,
vector dir=E, real size=0,
pen p=currentpen,
margin margin=NoMargin,
filltype filltype=NoFill)
void perpendicularmark(picture pic=currentpicture, point z, explicit pair align, path g,
real size=0, pen p=currentpen,
margin margin=NoMargin,
filltype filltype=NoFill)
void perpendicularmark(picture pic=currentpicture, point z, vector align, path g,
real size=0, pen p=currentpen,
margin margin=NoMargin,
filltype filltype=NoFill)
path compassmark(pair O, pair A, real position, real angle=10)À noter aussi la routine :
void addMargins(picture pic=currentpicture,
real lmargin=0, real bmargin=0,
real rmargin=lmargin, real tmargin=bmargin,
bool rigid=true, bool allObject=true)Pour le tracé des droites, ajoute des marges à l'image (remplace avantageusement interp).
Si rigid vaut false, les marges sont ajoutées si et seulement si une courbe infinie se prolonge jusqu'à la marge.
Si allObject vaut false, les objets de taille fixe (comme les labels et pointes de flèches) seront ignorés.
Quelques exemples :
|
|
|
|
Code 47 Sélectionnez |
Code 48 Sélectionnez |
|
|
|
|
Code 49 Sélectionnez |
Code 50 Sélectionnez |
|
|
|
|
Code 51 Sélectionnez |
Code 52 Sélectionnez |
|
Sélectionnez |
VI-C. trembling▲
Ce module permet de faire des figures « à main levée ». Plusieurs paramètres permettent de modifier l'effet :
real magneticRadius=1;
real trembleFuzz(){return min(1e-3,magneticRadius/10);}
real trembleAngle=4, trembleFrequency=0.5, trembleRandom=2;Pour saisir leur rôle, le plus simple est de faire des essais. Des explications sont données directement dans le fichier trembling.asy.
Il faut utiliser la structure tremble, ainsi que la méthode deform :
tremble tremble(real angle=trembleAngle, real frequency=trembleFrequency,
real random=trembleRandom, real fuzz=trembleFuzz())
path deform(path g...pair[] magneticPoints)Il faudra donc impérativement un type path …
|
|
|
|
Code 54 Sélectionnez |
Code 55 Sélectionnez |
|
|
|
|
Cod 56 Sélectionnez |
Code 57 Sélectionnez |
VI-D. graph▲
La documentation officielle est très complète sur ce module. Ce qui suit est un résumé de ce qui sera le plus utile dans un premier temps.
VI-D-1. Axes et repères▲
graph fournit les routines suivantes :
void xaxis(picture pic=currentpicture, Label L="", axis axis=YZero,
real xmin=-infinity, real xmax=infinity, pen p=currentpen,
ticks ticks=NoTicks, arrowbar arrow=None, bool above=false);Dessine l'axe des abscisses. Certains paramètres méritent de s'y attarder :
-
axis : détermine la position de l'axe. Les différents types sont :
- YZero(bool extend=true) : l'axe a pour équation y = 0 (ou y =.1 pour une échelle logarithmique),
extend=true (valeur par défaut) pour que l'axe soit aux dimensions complètes de la figure, - YEquals(real Y, bool extend=true) : l'axe a pour équation y = Y. (Voir plutôt yequals.),
- Bottom(bool extend=false) : l'axe est au bas de la figure,
- Top(bool extend=false) : l'axe est en haut,
- BottomTop(bool extend=false) : axes en bas et en haut ;
- YZero(bool extend=true) : l'axe a pour équation y = 0 (ou y =.1 pour une échelle logarithmique),
- xmin et xmax : automatiquement déterminés par les dimensions de la figure si non spécifiés ;
-
ticks : les traits de graduation. Les valeurs sont NoTicks (par défaut, aucune graduation), LeftTicks (graduations uniquement à gauche de l'axe), RightTicks (graduations uniquement à droite de l'axe) et Ticks (graduations des deux côtés de l'axe). Ces trois dernières routines prennent elles-mêmes de nombreux arguments en option :
SélectionnezticksTicks(Labelformat="", ticklabel ticklabel=null,boolbeginlabel=true,boolendlabel=true,intN=0,intn=0,realStep=0,realstep=0,boolbegin=true,boolend=true, tickmodifier modify=None,realSize=0,realsize=0,boolextend=false,penpTick=nullpen,penptick=nullpen); -
format : format des nombres sur les axes (par défaut "$%.4g$"). Pour n'avoir que les traits, sans les labels, la valeur est "%" ;
-
ticklabel : fonction string(real x) qui retourne le label (par défaut format(format.s,x)) de chaque graduation principale d'abscisse x. Voir par exemple labelfrac page 41 et le code 73.
Le ticklabel OmitFormat(string s=defaultformat ... real[] x) permet d'enlever certains labels, mais pas la graduation correspondante.
NoZeroFormat est une abréviation pour OmitFormat(0) ; -
beginlabel et endlabel : inclut le premier et le dernier label ;
-
N : quand la mise à l'échelle est activée (par défaut), l'axe est divisé en N intervalles séparés par les graduations principales ;
-
n : chaque intervalle principal est divisé en n intervalles secondaires séparés par les graduations secondaires ;
-
Step : la valeur entre chaque trait de graduation principale (si N=0) ;
-
step : la valeur entre chaque trait de graduation secondaire (si n=0) ;
-
begin et end : inclut le premier et le dernier trait de graduation principale ;
-
tickmodifier modify : fonction permettant de modifier des graduations « manuellement ».
Certains tickmodifier sont prédéfinis :
OmitTick(... real[] x), OmitTickInterval(real a, real b) et OmitTickIntervals(real[] a, real[] b) peuvent servir à enlever des graduations, ainsi que leurs labels.
NoZero est une abréviation pour OmitTick(0) ; -
Size et size : taille des graduations principales et secondaires ;
-
extend : étend les graduations. Permet de tracer des grilles ;
- pen pTick et ptick : stylos pour le tracé des traits de graduation.
|
|
|
|
Code 58 Sélectionnez |
Code 59 Sélectionnez |
Il est aussi possible de spécifier l'emplacement des graduations à l'aide d'un tableau de réels à l'aide de la routine (voir le code 59, valable aussi pour LeftTicks et RightTicks) :
ticks Ticks(Label format="", ticklabel ticklabel=null,
bool beginlabel=true, bool endlabel=true,
real[] Ticks, real[] ticks=new real[],
real Size=0, real size=0, bool extend=false,
pen pTick=nullpen, pen ptick=nullpen)De la même façon que xaxis est défini :
void yaxis(picture pic=currentpicture, Label L="", axis axis=XZero,
real ymin=-infinity, real ymax=infinity, pen p=currentpen,
ticks ticks=NoTicks, arrowbar arrow=None, bool above=false,
bool autorotate=true);Les paramètres sont similaires à ceux de xaxis. On notera pour le type axis les valeurs Left, Right et LeftRight.
Il est possible de fixer les valeurs xmin, xmax, ymin et ymax par la routine :
xlimits(picture pic=currentpicture, real min=-infinity,
real max=infinity, bool crop=NoCrop);et la routine ylimits.
Le booléen crop=Crop sert à couper les parties de la figure qui dépassent les limites.
|
|
|
|
Code 60 Sélectionnez |
Code 61 Sélectionnez |
Pour des axes déportés, on peut utiliser les routines suivantes :
void xequals(picture pic=currentpicture, Label L="", real x,
bool extend=false, real ymin=-infinity, real ymax=infinity,
pen p=currentpen, ticks ticks=NoTicks, bool above=true,
arrowbar arrow=None);
void yequals(picture pic=currentpicture, Label L="", real y,
bool extend=false, real xmin=-infinity, real xmax=infinity,
pen p=currentpen, ticks ticks=NoTicks, bool above=true,
arrowbar arrow=None);
void axes(picture pic=currentpicture, Label xlabel="", Label ylabel="",
pair min=(-infinity,-infinity), pair max=(infinity,infinity),
pen p=currentpen, arrowbar arrow=None, bool above=false);Voir le code 65. Dans cet exemple, les axes sont tracés dans une image séparée, qui est ajoutée à currentpicture à la fin.
|
|
|
|
Code 62 Sélectionnez |
Code 63 Sélectionnez |
|
|
|
|
Code 64 Sélectionnez |
Code 65 Sélectionnez |
Les routines suivantes permettent de placer manuellement des graduations :
void xtick(picture pic=currentpicture, Label L="", explicit pair z,
pair dir=N, string format="",
real size=Ticksize, pen p=currentpen);
void xtick(picture pic=currentpicture, Label L="", real x,
pair dir=N, string format="",
real size=Ticksize, pen p=currentpen);De la même façon que xtick est défini ytick.
void tick(picture pic=currentpicture, pair z,
pair dir, real size=Ticksize, pen p=currentpen);
void labelx(picture pic=currentpicture, Label L="", explicit pair z,
align align=S, string format="", pen p=nullpen);
void labelx(picture pic=currentpicture, Label L="", real x,
align align=S, string format="", pen p=nullpen);
void labelx(picture pic=currentpicture, Label L,
string format="", explicit pen p=currentpen);De la même façon que labelx est défini labely.
VI-D-2. Représentations de fonctions▲
Plusieurs routines permettent de définir un graphe. Seules les plus utiles pour débuter seront vues (voir la documentation officielle pour les autres).
guide graph(picture pic=currentpicture, real f(real), real a, real b,
int n=ngraph, real T(real)=identity,
interpolate join=operator --);Retourne le graphe de la fonction f sur l'intervalle kitxmlcodeinlinelatexdvp\left[T(a) ;T(b)\right]finkitxmlcodeinlinelatexdvp, basé sur n points (100 par défaut) régulièrement espacés dans kitxmlcodeinlinelatexdvp\left[a ;b\right]finkitxmlcodeinlinelatexdvp.
|
|
|
Code 66 Sélectionnez |
guide graph(picture pic=currentpicture, real x(real), real y(real),
real a, real b, int n=ngraph, real T(real)=identity,
interpolate join=operator --);Retourne la courbe paramétrée kitxmlcodeinlinelatexdvp\left(x(t);y(t)\right)\quad\forall t \in \left[T(a);T(b)\right]finkitxmlcodeinlinelatexdvp.
|
|
|
Code 67 Sélectionnez |
guide polargraph(picture pic=currentpicture, real f(real), real a,
real b, int n=ngraph, interpolate join=operator --);Retourne le graphe de la fonction kitxmlcodeinlinelatexdvpffinkitxmlcodeinlinelatexdvp en coordonnées polaires sur l'intervalle kitxmlcodeinlinelatexdvp[a;b].finkitxmlcodeinlinelatexdvp
|
|
|
Code 68 Sélectionnez |
Remarque : Fonctions non définies en certaines valeurs
Deux possibilités ici :
-
« enlever » les valeurs interdites : pour l'exemple, considérons la fonctionkitxmlcodeinlinelatexdvpf : x \longmapsto \dfrac{-1}{x^2-4x+3}.finkitxmlcodeinlinelatexdvp
Cette fonction est définie surkitxmlcodeinlinelatexdvp\mathbb{R}\setminus\{1;3\}.finkitxmlcodeinlinelatexdvpLa courbe sera découpée en trois graphes,kitxmlcodeinlinelatexdvp\mathcal{C_1},\ \mathcal{C_2}\ \mathrm{et}\ \mathcal{C_3}finkitxmlcodeinlinelatexdvp qui éviteront soigneusement les valeurs 1 et 3.Code 69Sélectionnezimportgraph;usepackage("mathrsfs");unitsize(x=1cm,y=1cm);transformec=scale(.8);xaxis(ec*"$x$",Ticks(ec*Label(),NoZero),Arrow(2mm));yaxis(ec*"$y$",Ticks(ec*Label(),NoZero),Arrow(2mm));labelx(ec*"$O$",0,SW);realf(realx) {return-1/(x^2-4*x+3);}pathc1=graph(f,-2.8,.9);// on évite les valeurspathc2=graph(f,1.1,2.9);// interditespathc3=graph(f,3.1,6.8);//draw(c1^^c2^^c3,bp+heavyred);ylimits(-2.9,2.9,Crop);// on coupe ce qui dépasselabel("$\mathscr{C}_f$",(3,1.5),heavyred); - utiliser le module contour et tracer la courbe comme une ligne de niveau.
On utilise la routine suivante :
guide[][] contour(real f(real, real), pair a, pair b,
real[] c, int nx=ngraph, int ny=nx,
interpolate join=operator--, int subsample=1)- f : fonction de deux variables réelles.
- a et b : les sommets de la diagonale du domaine rectangulaire.
- c : tableau contenant les valeurs des lignes de niveau.
- nx et ny : nombre de subdivisions dans les directions x et y (détermine la précision).
- join : l'opérateur d'interpolation (-- ou ..).
- subsample : nombre de points intérieurs à inclure dans chaque carré de la grille (en plus des points sur le bord).
Pour notre exemple, la courbe kitxmlcodeinlinelatexdvp\mathcal{C_f}finkitxmlcodeinlinelatexdvp a pour équation kitxmlcodeinlinelatexdvpy=\dfrac{-1}{x^2-4x+3}.finkitxmlcodeinlinelatexdvp
D'où l'on tire : kitxmlcodeinlinelatexdvpy\times (x^2-4x+3)=-1.finkitxmlcodeinlinelatexdvp
On considérera donc la fonction kitxmlcodeinlinelatexdvpF(x , y)= y(x^2-4x+3)finkitxmlcodeinlinelatexdvp et on tracera la ligne de niveau -1.
|
|
|
Code 70 Sélectionnez |
Voir aussi le code 71
VI-D-3. Extension graph_pi▲
Cette extension de Philippe Ivaldi apporte bon nombre d'outils intéressants.
Elle peut être téléchargée à cette adresse : git.piprime.fr/?p=asymptote/pi-packages.git;a=tree, lien snapshot, et placée dans le dossier $HOME/.asy.
Pour une utilisation avec git, voir : forum.mathematex.net/asymptote-f34/version-2-10-et-graph-pi-t13226.html#p127606.
Les modules graph, markers et base_pi (voir à l'adresse ci-dessus) sont chargés par graph_pi, ainsi que le package kitxmlcodeinlinelatexdvp\rm\LaTeXfinkitxmlcodeinlinelatexdvpmathrsfs.
Axes et repères :
void graphicrules(picture pic=currentpicture, real unit=1cm,
real xunit=unit != 0 ? unit : 0,
real yunit=unit != 0 ? unit : 0,
real xmin=-infinity, real xmax=infinity,
real ymin=-infinity, real ymax=infinity,
bool crop=NoCrop, bool xcrop=crop, bool ycrop=crop)Passe les dimensions du graphique à cartesianaxis, grid, et millimeterpaper (voir ci-après).
void cartesianaxis(picture pic=currentpicture,
Label Lx=Label("$x$",align=2S),
Label Ly=Label("$y$",align=2W),
real xmin=-infinity, real xmax=infinity,
real ymin=-infinity, real ymax=infinity,
real extrawidth=1, real extraheight=extrawidth,
pen p=currentpen,
ticks xticks=Ticks("%",pTick=nullpen, ptick=grey),
ticks yticks=Ticks("%",pTick=nullpen, ptick=grey),
bool viewxaxis=true,
bool viewyaxis=true,
bool above=true,
arrowbar arrow=Arrow)Trace l'axe des abscisses, des ordonnées ou les deux (viewxaxis et viewyaxis qui prennent les valeurs true ou false). extrawidth est la longueur ajoutée à l'axe des abscisses par rapport à xmin et xmax. On a la même chose avec extraheight pour l'axe des ordonnées.
|
Code 71 Sélectionnez |
void labeloij(picture pic=currentpicture,
Label Lo=Label("$O$",NoFill),
Label Li=Label("$\overrightarrow{\imath}$",NoFill),
Label Lj=Label("$\overrightarrow{\jmath}$",NoFill),
pen p=scale(2)*currentpen,
pair diro=SW, pair diri=labelijmargin*S, pair dirj=labelijmargin*1.5*W,
filltype filltype=NoFill, arrowbar arrow=Arrow(2mm),
marker marker=dot)Trace le repère kitxmlcodeinlinelatexdvp(O; \vec{\imath}; \vec{\jmath}).finkitxmlcodeinlinelatexdvp
void labeloIJ(picture pic=currentpicture,
Label Lo=Label("$O$",NoFill),
Label LI=Label("$I$",NoFill),
Label LJ=Label("$J$",NoFill),
pair diro=SW, pair dirI=labelIJmargin*S, pair dirJ=labelIJmargin*W,
pen p=currentpen,
filltype filltype=NoFill,
marker marker=dot)Trace le repère kitxmlcodeinlinelatexdvp(O;I;J).finkitxmlcodeinlinelatexdvp
void grid(picture pic=currentpicture,
real xmin=pic.userMin.x, real xmax=pic.userMax.x,
real ymin=pic.userMin.y, real ymax=pic.userMax.y,
real xStep=1, real xstep=.5,
real yStep=1, real ystep=.5,
pen pTick=currentpen, pen ptick=grey, bool above=false)Trace une grille.
|
|
|
Code 72 Sélectionnez |
picture millimeterpaper(picture pic=currentpicture, pair O=(0,0),
real xmin=infinity, real xmax=infinity,
real ymin=infinity, real ymax=infinity,
pen p=.5bp+orange)Grille sous forme de papier millimétré.
ticklabel labelfrac(real ep=1/10^5, real factor=1,
string symbol="",
bool signin=false, bool symbolin=true,
bool displaystyle=false,
bool zero=true)Ce ticklabel permet d'écrire les graduations sous forme de fractions. Attention, base_pi doit être dans le dossier $HOME/.asy.
|
Sélectionnez |
Représentations graphiques de suites :
recursiveroutime recursiveoption(Label L="u",
bool labelbegin=true,
bool labelend=true,
bool labelinner=true,
bool labelalternate=false,
string format="",
int labelplace=onX,
pen px=nullpen,
pen py=nullpen,
bool startonyaxis=false,
arrowbar circuitarrow=None,
marker automarker=marker(cross(4)),
marker xaxismarker=nomarker,
marker yaxismarker=nomarker,
marker xmarker=nomarker,
marker fmarker=nomarker)Les options du graphique :
- L : le nom de la suite (à taper sans $) ;
- labelbegin : si la valeur est true, le premier terme est placé ;
- labelend : même chose pour le dernier terme ;
- abelinner : si la valeur est true, les termes compris entre le premier et le dernier sont placés ;
- labelalternate : si la valeur est true, les termes sont alternés par rapport à l'axe ;
- format : le format d'affichage de la valeur. Par exemple « %.2f » (deux chiffres après la virgule) ;
- labelplace : emplacement des termes : onX, onY, ou onXY ;
- px et py : stylos pour les tracés des traits de lecture ;
- startonyaxis : comme son nom l'indique… ;
- circuitarrow : flèches sur le « circuit » ;
- Pour tous les marker, voir le code 75.
recursivegraph recursivegraph(real F(real), real u0, int n0=0, int n)
« Graphe » de la suite : kitxmlcodeinlinelatexdvpu0finkitxmlcodeinlinelatexdvp est le premier terme, kitxmlcodeinlinelatexdvpn0finkitxmlcodeinlinelatexdvp est l'indice du premier terme etkitxmlcodeinlinelatexdvpnfinkitxmlcodeinlinelatexdvp pour spécifier le nombre de termes placés sur le graphique (le dernier terme placé est celui d'indicekitxmlcodeinlinelatexdvpn-1finkitxmlcodeinlinelatexdvp).
void draw(picture pic=currentpicture, Label L="", recursivegraph g,
recursiveroutime lr=DefaultRecursiveOption, align align=NoAlign,
pen p=currentpen, arrowbar arrow=None, arrowbar bar=None,
margin margin=NoMargin, Label legend="", marker marker=nomarker)|
Code 74 Sélectionnez |
|
Code 75 Sélectionnez |
void graphpoint(picture pic=currentpicture,
Label L="",
real f(real), real xCoordinate,
real xmin=0, real ymin=0,
int draw=onXY,
pen px=nullpen, pen py=px,
arrowbar arrow=None, arrowbar bar=None,
margin marginy=NoMargin, margin marginx=NoMargin,
bool extend=false, bool extendx=extend, bool extendy=extend,
Label legendx="", Label legendy="",
marker markerx=nomarker, marker markery=nomarker)
path tangent(path g, real x, pathb=box(userMin(currentpicture),userMax(currentpicture)))
void addtangent(picture pic=currentpicture,
path g,//Point on the path g
pair pt,// real x (x-Coordinate) est aussi défini
real size=infinity,//ABSOLUTE size of the tangent line
bool drawright=true,//Draw the tangent at the right
bool drawleft=true,//... left
pair v=(infinity,infinity),//A finite value forces the value of the derivative
pair vr=v,//A finite value forces the value of the derivative at right
pair vl=v,//A finite value forces the value of the derivative at left
arrowbar arrow=null,//null=automatic determination
margin margin=NoMargin,//Useful with size=infinity
Label legend="",
pen p=currentpen,
real dt=2,
bool differentiable=true)|
Code 76 Sélectionnez |
VI-E. animation▲
Ce module permet de faire des animations aux formats gif et mpeg en utilisant convert d'ImageMagick (qui doit donc être installé sur l'ordinateur), ainsi qu'au format PDF (animations visibles avec Acrobat Reader).
Pour obtenir un gif par exemple, il suffit de compiler avec l'option -f gif :
asy -f gif
ou d'ajouter dans le fichier asy
settings.outformat="gif";
En pratique, le module animate.asy importe le module animation.asy et le package animate.sty. Pour plus d'éclaircissements, il faudra donc se référer au fichier animation.asy, ainsi qu'à la documentation du package kitxmlcodeinlinelatexdvp\rm\LaTeXfinkitxmlcodeinlinelatexdvpanimate.sty (qui est donc requis).
VI-E-1. Création d'animations autonomes▲
Les principales routines utilisées ici sont :
void erase(picture pic=currentpicture);
qui efface l'image,
void save()
qui sauvegarde l'image à l'endroit où elle est utilisée,
void restore()
qui restaure (c'est facile l'anglais !) l'image au point où elle a été sauvegardée par save(), et enfin
void add(picture pic=currentpicture, enclosure enclosure=NoBox)
qui ajoute l'image à l'animation.
Un exemple : construction de la médiatrice d'un segment. (Pour voir l'animation, il faut utiliser Acrobat Reader.)
|
Code 77 Sélectionnez |
Quelques sorties
label(Anim.pdf("<options>",keep=true,multipage=false));
pour obtenir un PDF par image.
label(Anim.pdf("<options>",keep=true,multipage=true));
pour obtenir l'animation et le PDF multipage (PDF contenant une page par image).
label(Anim.pdf("<options>"));
pour l'animation uniquement.
Anim.movie();
pour obtenir un PDF multipage.
Anim.glmovie();
pour une sortie dans la fenêtre OpenGL, à compiler avec asy -V
Pour les options entre guillemets, ce sont les options du package animate.sty (il faut consulter sa documentation pour davantage de précisions). On trouve entre autres :
- autoplay : démarre l'animation automatiquement ;
- loop : l'animation recommence en boucle ;
- controls : pour les boutons de contrôle (sinon, il faut cliquer sur l'animation pour la lancer) ;
- buttonsize=<size>, buttonbg=<colour>, buttonfg=<colour> : mise en forme des boutons ;
- palindrome : l'animation s'exécute d'avant en arrière ;
- step : pas à pas ;
- width=..., height=..., depth=... : redimensionne l'animation ;
- scale=... : mise à l'échelle de l'animation.
Il est aussi possible de préciser le temps (en millisecondes) entre chaque image, par exemple :
label(Anim.pdf("controls",delay=50));
pour une image toutes les 50 millisecondes.
movie() peut aussi prendre des arguments, utile par exemple pour la création d'un gif (puisqu'il n'y aura pas de boutons de contrôle…). L'exemple ci-contre peut être compilé directement par : asy mongif.asy.
import animation;
settings.outformat="gif";
size(100,100);
path c1=circle((0,0),1);
path c2=circle((0,.6),.4);
draw(c1,bp+purple);
animation Anim;
// -------------------------------
for(int i=0; i < 360; i+=10)
{
save();
draw(rotate(i)*c2,bp+heavymagenta);
Anim.add();
restore();
}
// -------------------------------
Anim.movie(loops=3,delay=50);VI-E-2. Inclure une animation externe dans un fichier .tex▲
L'animation doit être créée avec la sortie Anim.movie() (PDF multipage). Le package animate.sty va se charger de reconstituer l'animation à l'aide de la commande : \animategraphics[<options>]{<frame rate>}{<file basename>}{<first>}{<last>}
<file basename> est le nom de l'animation sans extension et <frame rate> est le nombre d'images par seconde. <first> et <last>, la première et dernière image.
Exemple :
\documentclass{article}
\usepackage{animate}
\begin{document}
\animategraphics[width=\linewidth,controls]{10}{animcos}{}{}
\end{document}// Animation réalisée avec l'aide de Gaétan Marris et Olivier Guibé
import graph_pi;
import animate;
settings.tex="pdflatex";
settings.outformat="pdf";
usepackage("fourier","upright");
real f(real x) {return cos(x);}
path Cf1=graph(f,0,pi,n=20,Hermite);
path Cf2=graph(f,-pi,pi,n=20,Hermite);
path Cf3=graph(f,pi,3pi,n=20,Hermite);
transform sc=scale(.8);
pen pinit=1.2bp+magenta, pf=1.2bp+.8blue, pvec=bp+deepgreen;
animation A;
// ------------------------------------------------------------------------------
void trace(path f, pen p,
Label L="", real r=0, real per=2pi, pair NS=(0,0),
pen pv=nullpen, arrowbar arrow=Arrow(HookHead,2mm)){
draw(f,p);
if (NS!=(0,0))
draw(Label(sc*L,Fill(white),align=NS),(r,f(r))--(r+per,f(r+per)),pv,arrow);
}
graphicrules(xunit=1cm, yunit=1cm, xmin=-3pi, xmax=3pi, ymin=-1.5, ymax=1.5);
add(millimeterpaper(p=1bp+orange),(0,0));
labeloij(Lo=sc*"$O$",Li=sc*"$\overrightarrow{\imath}$",Lj=sc*"$\overrightarrow{\jmath}$");
cartesianaxis(xticks=Ticks(sc*Label(Fill(white)),
labelfrac(factor=pi,symbol="\pi",symbolin=true,
zero=false),
Step=pi/2,
ptick=black),
yticks=Ticks(sc*Label(Fill(white)),
labelfrac(zero=false),Step=1,step=.5));
A.add();
// ------------------------------------------------------------------------------
for (real p=-1; p<=1; p+=.1) {
save();
trace(Cf1,pinit);
draw(xscale(-p)*Cf1,pinit);
A.add();
restore();
}
for (real t=0; t<=2pi; t+=pi/25) {
save();
trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
draw(shift(t,0)*Cf2,pf);
A.add();
restore();
}
for (real t=0; t<=2pi+pi/25; t+=pi/25) {
save();
trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
trace(Cf3,pf,"$-2\pi \vec{\imath}$",-pi,-2pi,S,pvec);
draw(shift(-t,0)*Cf2,pf);
A.add();
restore();
}
erase();
A.movie();
add(millimeterpaper(p=1bp+orange),(0,0));
labeloij(Lo=sc*"$O$",Li=sc*"$\overrightarrow{\imath}$",Lj=sc*"$\overrightarrow{\jmath}$");
cartesianaxis(xticks=Ticks(sc*Label(Fill(white)),
labelfrac(factor=pi,symbol="\pi",symbolin=true,
zero=false),Step=pi/2, ptick=black),
yticks=Ticks(sc*Label(Fill(white)),
labelfrac(zero=false),Step=1,step=.5));
A.add();
// ------------------------------------------------------------------------------
for (real p=-1; p<=1; p+=.1) {
save();
trace(Cf1,pinit);
draw(xscale(-p)*Cf1,pinit);
A.add();
restore();
}
for (real t=0; t<=2pi; t+=pi/25) {
save();
trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
draw(shift(t,0)*Cf2,pf);
A.add();
restore();
}
for (real t=0; t<=2pi+pi/25; t+=pi/25) {
save();
trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
trace(Cf3,pf,"$-2\pi \vec{\imath}$",-pi,-2pi,S,pvec);
draw(shift(-t,0)*Cf2,pf);
A.add();
restore();
}
erase();
A.movie();Pour voir l'animation, il faut utiliser Acrobat Reader.
VI-E-3. Inclure le code dans un fichier .tex▲
On se contentera ici de copier le code du fichier inlinemovie.tex de la galerie d'exemples du site officiel : asymptote.sourceforge.net/gallery/animations
\documentclass{article}
\usepackage[inline]{asymptote}
%\usepackage{asymptote}
\usepackage{animate}
\begin{document}
Here is an inline PDF movie, generated with the commands
\begin{verbatim}
pdflatex inlinemovie
asy inlinemovie-*.asy
pdflatex inlinemovie
\end{verbatim}
or equivalently,
\begin{verbatim}
latexmk -pdf inlinemovie
\end{verbatim}
\begin{center}
\begin{asy}
import animate;
animation A=animation("movie1");
real h=2pi/10;
picture pic;
unitsize(pic,2cm);
for(int i=0; i < 10; ++i) {
draw(pic,expi(i*h)--expi((i+1)*h));
A.add(pic);
}
label(A.pdf("controls",delay=50,keep=!settings.inlinetex));
\end{asy}
%Uncomment the following line when not using the [inline] package option:
%\ASYanimategraphics[controls]{50}{movie1}{}{}
\end{center}
And here is anasymptote one, clickable but without the control panel:
\begin{center}
\begin{asy}
import animate;
animation A=animation("movie2");
real h=2pi/10;
picture pic;
unitsize(pic,2cm);
for(int i=0; i < 10; ++i) {
draw(pic,expi(-i*h)--expi(-(i+1)*h),red);
A.add(pic);
}
label(A.pdf(keep=!settings.inlinetex));
\end{asy}
%Uncomment the following line when not using the [inline] package option:
%\ASYanimategraphics[controls]{10}{movie2}{}{}
\end{center}
\end{document}VII. Remerciements developpez▲
Nous remercions l'auteur Christophe GROSPELLIER de nous avoir permis de publier cet article, nous remercions aussi les membres de l'équipe : Claude LELOUP pour la correction orthographique, Winjerome pour la relecture technique et -nikopol- pour la gabarisation.



