b7a74e613c5c5433ecb5f15b1f8d7ec1d014f73e
[luatex.git] / luamplibAnimate / page.html
1 <div>
2 <div class="alert alert-info">
3 <p>
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>
6 <ul>
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>
9 </ul>
10 </div>
11 <ul>
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>
14 </ul>
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>
20 </div>
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&#39;héritage pour la mémoire entre les figures</span>
24 \newcommand{\lemniscate}[1]{<span class="co">% #1: l&#39;angle en degres</span>
25 \begin{mplibcode}
26 if(#1=0):
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;
34 fi;
35 beginfig(#1);
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;
40 pair O,P,Q,R,M;
41 O:=(0,0);
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>
50 QR := abs(R-Q);
51 if(sind(#1)&gt;0.0):
52 M = Q + (0,QR);
53 else:
54 M = Q - (0,QR);
55 fi;
56
57 if #1=0:
58 lemn:=M;
59 else:
60 lemn:= lemn--M;
61 fi;
62
63 if ((#1&gt;0) and (#1&lt;90)) or ((#1&gt;180) and (#1&lt;270)):
64 draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
65 draw carre scaled 6 rotated (angle(R-P)) shifted R;
66 fi;
67 if((#1&gt;=90) and (#1&lt;180)) or ((#1&gt;=270) and (#1&lt;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;
70 fi;
71
72 draw O--P dashed evenly withcolor blue;
73 draw P--Q dashed evenly withcolor blue;
74 draw R--Q--M withcolor green;
75
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));
81
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);
87
88 pickup pencircle scaled 1pt;
89 draw lemn withcolor red;
90
91 clip currentpicture to (-s*u,-s*u)--(s*u,-s*u)--(s*u,s*u)--(-s*u,s*u)--cycle;
92 endfig;
93 \end{mplibcode}
94 }</code></pre></div>
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}}
99 \end{animateinline}
100 \end{center}</code></pre></div>
101 </div>
102 <div style="clear:both"></div>

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.