2 <div class=
"alert alert-info">
4 <p>Grâce à l'extension
<code>luamplib
</code> pour Lua(La)TeX et l'extension
<code>animate
</code>, on peut réaliser très facilement des animations avec MetaPost, lisibles dans an PDF avec
<em>Acrobat Reader
</em>. En effet,
<code>luamplib
</code> nous permet de créer des figures avec l'environnement
<code>mplibcode
</code> qu'on anime avec l'environnement
<code>animateinline
</code>.
</p>
5 <p>Les documentations des deux extensions utilisées :
</p>
7 <li><a href=
"http://mirror.hmc.edu/ctan/macros/luatex/generic/luamplib/luamplib.pdf%20%22lien%20vers%20le%20pdf%22"><code>luamplib
</code></a></li>
8 <li><a href=
"http://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/ctan/macros/latex/contrib/animate/animate.pdf%20%22lien%20vers%20le%20pdf%22"><code>animate
</code></a>.
</li>
12 <li>La compilation se fait avec :
<code>lualatex mplibanimate.tex
</code>.
</li>
13 <li>Le code MetaPost est extrait de l'
<a href=
"http://melusine.eu.org/syracuse/metapost/animations/gerono/" class=
"uri">http://melusine.eu.org/syracuse/metapost/animations/gerono/
</a></li>
15 <h2 id=
"explications">Explications
</h2>
16 <p>L’extension animate permet de générer des animations lisibles dans un PDF par le lecteur
<em>Acrobat Reader
</em>. Plusieurs options sont envisageables : soit produire l’animation à partir d’une séquence d’images pré-construites (sous différents formats, JPEG, ps, pdf, etc.), soit à partir d’image généré par du code LaTeX comme tikz , pstricks , etc. et... MetaPost ! C’est ce que nous présentons ici à partir de l'exemple d'
<a href=
"http://melusine.eu.org/syracuse/metapost/animations/gerono/" class=
"uri">http://melusine.eu.org/syracuse/metapost/animations/gerono/
</a>.
</p>
17 <p>Dans cet exemple, on paramétrise un certain point (P = (, )) à l’aide du paramètre d’angel () qui permet de construire le lemniscate de Gerono grâce à la recette suivante :
</p>
18 <div class=
"alert alert-info">
19 <p>Soit (P) un point décrivant un cercle de centre (O) et de rayon (a). On projette (P) en (Q) sur l’axe ((Ox)), puis (Q) en (R) sur le segment ([OP]). Le lemniscate de Gerono est alors le lieu du point (M) de ([PQ]) tel que (QM = QN).
</p>
21 <p>À partir de là, on construit la commande qui prend pour argument la valeur de l’angle, et qui construit l’image correspondante. On va ici utiliser l’
<em>héritage
</em> qui permet de garder en mémoire les unités et la courbe construite au fur et à mesure, à partir des étapes précédentes.
</p>
22 <p>On encapsule le code MetaPost dans un
<em>macro
</em> LaTeX grâce à l'environnement
<code>mplibcode
</code> de
<code>luamplib
</code>.
</p>
23 <div class=
"sourceCode"><pre class=
"sourceCode latex"><code class=
"sourceCode latex">\mplibcodeinherit{enable}
<span class=
"co">% l
'héritage pour la mémoire entre les figures
</span>
24 \newcommand{\lemniscate}[
1]{
<span class=
"co">% #
1: l
'angle en degres
</span>
27 u:=
3cm;
<span class=
"co">%
</span>
28 a:=
2u;
<span class=
"co">%
</span>
29 h:=a/
4;
<span class=
"co">%
</span>
30 s:=
1.3;
<span class=
"co">%
</span>
31 path lemn;
<span class=
"co">%
</span>
32 path carre;
<span class=
"co">%
</span>
33 carre = (
0,
0)--(
1,
0)--(
1,
1)--(
0,
1)--cycle;
36 pickup pencircle scaled
0.6pt;
37 drawarrow (
0,-s*u)--(
0,s*u);
38 drawarrow (-s*u,
0)--(s*u,
0);
39 path cercle,hori,verti;
42 cercle := fullcircle scaled (a);
43 pickup pencircle scaled
0.4pt;
44 draw cercle dashed evenly withcolor blue;
45 P:=(a/
2*cosd(#
1),a/
2*sind(#
1));
<span class=
"co">% chemin qui parcourt le cercle
</span>
46 Q:=(a/
2*cosd(#
1),
0);
<span class=
"co">%projection sur (Ox)
</span>
47 <span class=
"co">% projection de Q sur [O,P]
</span>
48 R = cosd(#
1)*cosd(#
1)*(a/
2*cosd(#
1),a/
2*sind(#
1));
49 <span class=
"co">% M sur [PQ] tel que QM = QR
</span>
63 if ((#
1>0) and (#
1<90)) or ((#
1>180) and (#
1<270)):
64 draw carre scaled
6 rotated (angle(Q-P)+
180) shifted Q;
65 draw carre scaled
6 rotated (angle(R-P)) shifted R;
67 if((#
1>=
90) and (#
1<180)) or ((#
1>=
270) and (#
1<360)):
68 draw carre scaled
6 rotated (angle(Q-P)+
180) shifted Q;
69 draw carre scaled
6 rotated (angle(R-P)+
180) shifted R;
72 draw O--P dashed evenly withcolor blue;
73 draw P--Q dashed evenly withcolor blue;
74 draw R--Q--M withcolor green;
76 label.lrt(btex $a$ etex, (a/
2,
0));
77 label.llft(btex $x$ etex, (s*u,
0));
78 label.llft(btex $y$ etex, (
0,s*u));
79 label(btex \itshape Lemniscate \par de Gerono etex, (-
0.7u,
1.15u));
80 label(btex $x^
4=a^
2(x^
2-y^
2)$ etex, (
0.7u,-
1.15u));
82 dotlabel.llft(btex $O$ etex, O);
83 dotlabel.urt(btex $M$ etex, M);
84 dotlabel.urt(btex $P$ etex, P);
85 dotlabel.urt(btex $Q$ etex, Q);
86 dotlabel.urt(btex $R$ etex, R);
88 pickup pencircle scaled
1pt;
89 draw lemn withcolor red;
91 clip currentpicture to (-s*u,-s*u)--(s*u,-s*u)--(s*u,s*u)--(-s*u,s*u)--cycle;
95 <p>Il suffit alors de construire l'animation avec l'extension
<code>animate
</code> et son environnement
<code>animateinline
</code>.
</p>
96 <div class=
"sourceCode"><pre class=
"sourceCode latex"><code class=
"sourceCode latex">\begin{center}
97 \begin{animateinline}[poster=
230, controls]{
24}
98 \multiframe{
360}{ii=
0+
1}{\lemniscate{\ii}}
100 \end{center}
</code></pre></div>
102 <div style=
"clear:both"></div>