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 install
Remarques :
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.asy
Quelques 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.asy
La 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-*.asy
Les 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.tex
cré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
);path
chemin=(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électionnezvoid
fill
(picture
pic=currentpicture
,path
g,pen
p=currentpen
)void
filldraw
(picture
pic=currentpicture
,path
g,pen
fillpen=currentpen
,pen
drawpen=currentpen
)Ces deux fonctions servent à remplir les chemins cycliques :
Code 7Sélectionnezsize
(5cm
,0
);path
rec=(0
,0
)--(1
,0
)--(1
,.5
)--(0
,.5
)--cycle
;fill
(rec,lightyellow
);Code 8Sélectionnezsize
(5cm
,0
);path
r=(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 :line
line
(point
A,bool
extendA=true
,point
B,bool
extendB=true
)
Pour les droites, demi-droites (extendA=false ou extendB=false) et segments de droites (extendA=false et extendB=false).line
line
(coordsys
R=currentcoordsys
,real
a,real
b,real
c)
Renvoie la droite d'équationkitxmlcodeinlinelatexdvpax+by +c = 0finkitxmlcodeinlinelatexdvp dans le repère R.line
line
(coordsys
R=currentcoordsys
,real
slope,real
origin
)
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.line
parallel
(point
M,explicit
vector
dir)
Renvoie la droite de vecteur directeur dir et passant par M.line
parallel
(point
M,explicit
pair
dir)
Renvoie la droite de vecteur directeur dir donné dans le repère courant currentcoordsys et passant par M.line
line
(real
a,point
A=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.line
bisector
(line
l1,line
l2,real
angle=0
,bool
sharp=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.line
sector
(int
n=2
,int
p=1
,line
l1,line
l2,real
angle=0
,bool
sharp=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.line
perpendicular
(point
M,line
l)
Renvoie la droite perpendiculaire à l passant par M.line
perpendicular
(point
M,explicit
vector
normal)
Renvoie la droite passant par M et de vecteur normal normal.line
perpendicular
(point
M,explicit
pair
normal)
Renvoie la droite passant par M et de vecteur normal normal donné dans le repère courantcurrentcoordsys
.line
reverse
(line
l)
Renvoie la droite représentée par l avec une orientation contraire à celle de l.line
extend
(line
l)
Renvoie la droite portée par l qui peut être une demi-droite ou un segment de droite.line
complementary
(explicit
line
l)
Renvoie la demi-droite complémentaire de l. Ne fonctionne que si l représente effectivement une demi-droite.- Segment :
segment
segment
(point
A,point
B)
On notera notamment la routine :line
bisector
(segment
s,real
angle=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
(explicit
segment
s)
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 :circle
circle
(explicit
point
C,real
r)
Renvoie le cercle de centre C et de rayon r.circle
circle
(point
A,point
B)
Renvoie le cercle de diamètre AB.circle
circle
(point
A,point
B,point
C)
Renvoie le cercle passant par les points distincts A, B et C.
Etc. (Voir la documentation.) - arc : pour les arcs orientés d'ellipses.
arc
arc
(ellipse
el,real
angle1,real
angle2,polarconicroutine polarconicroutine=polarconicroutine
(el),bool
direction=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électionnezstruct
triangle
{restricted
point
A, B, C;// points marquant les sommets du triangle
struct
vertex
{// sommet de triangle
int
n;triangle
t; }restricted
vertex
VA, VB, VC;// les sommets du triangle
struct
side
{// côté de triangle
int
n;triangle
t; }side
AB, BC, CA, BA, AC, CB;// les côtés du triangle
}Sélectionnezvoid
label
(picture
pic=currentpicture
,Label
LA="$A$"
,Label
LB="$B$"
,Label
LC="$C$"
,triangle
t,real
alignAngle=0
,real
alignFactor=1
,pen
p=nullpen
,filltype
filltype
=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électionnezvoid
show
(picture
pic=currentpicture
,Label
LA="$A$"
,Label
LB="$B$"
,Label
LC="$C$"
,Label
La="$a$"
,Label
Lb="$b$"
,Label
Lc="$c$"
,triangle
t,pen
p=currentpen
,filltype
filltype
=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électionnezvoid
draw
(picture
pic=currentpicture
,triangle
t,pen
p=currentpen
,marker
marker
=nomarker
) -
Trace le triangle t ; les côtés sont tracés comme des segments.
void
drawline
(picture
pic=currentpicture
,triangle
t,pen
p=currentpen
)
Trace le triangle t ; les côtés sont tracés comme des droites.triangle
triangle
(point
A,point
B,point
C)
Renvoie le triangle dont les sommets sont A, B et C.triangle
triangleabc
(real
a,real
b,real
c,real
angle=0
,point
A=(0
,0
))
Retourne le triangle ABC tel que BC=a, AC=b, AB=c ettriangle
triangleAbc
(real
alpha,real
b,real
c,real
angle=0
,point
A=(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}.finkitxmlcodeinlinelatexdvptriangle
triangle
(line
l1,line
l2,line
l3)
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électionnezticks
Ticks
(Label
format=""
, ticklabel ticklabel=null
,bool
beginlabel=true
,bool
endlabel=true
,int
N
=0
,int
n=0
,real
Step=0
,real
step=0
,bool
begin=true
,bool
end=true
, tickmodifier modify=None
,real
Size=0
,real
size=0
,bool
extend=false
,pen
pTick=nullpen
,pen
ptick=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électionnezimport
graph;usepackage
("mathrsfs"
);unitsize
(x=1cm
,y=1cm
);transform
ec=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
);real
f
(real
x) {return
-1
/(x^2
-4
*x+3
);}path
c1=graph
(f,-2
.8
,.9
);// on évite les valeurs
path
c2=graph
(f,1
.1
,2
.9
);// interdites
path
c3=graph
(f,3
.1
,6
.8
);//
draw
(c1^^c2^^c3,bp
+heavyred
);ylimits
(-2
.9
,2
.9
,Crop
);// on coupe ce qui dépasse
label
("$\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.