Luamplib et animate
[luatex.git] / luamplibAnimate / page.md
1 <div class="alert alert-info">
2 <p>Grâce à l'extension `luamplib` pour Lua(La)TeX et
3 l'extension `animate`, on peut réaliser très facilement des
4 animations avec MetaPost, lisibles dans an PDF avec *Acrobat
5 Reader*. En effet, `luamplib` nous permet de créer des
6 figures avec l'environnement `mplibcode` qu'on anime avec
7 l'environnement `animateinline`.
8
9 Les documentations des deux
10 extensions utilisées  :
11
12 * [`luamplib`](http://mirror.hmc.edu/ctan/macros/luatex/generic/luamplib/luamplib.pdf
13 "lien vers le pdf")
14 * [`animate`](http://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/ctan/macros/latex/contrib/animate/animate.pdf
15 "lien vers le pdf").
16
17 </div>
18
19 * La compilation se fait avec : `lualatex mplibanimate.tex`.
20 * Le code MetaPost est extrait de l'<http://melusine.eu.org/syracuse/metapost/animations/gerono/>
21
22 ## Explications
23
24 L’extension animate permet de générer des animations lisibles dans un
25 PDF par le lecteur *Acrobat Reader*. Plusieurs options sont
26 envisageables : soit produire l’animation à partir d’une séquence
27 d’images pré-construites (sous différents formats, JPEG, ps, pdf,
28 etc.), soit à partir d’image généré par du code LaTeX comme tikz ,
29 pstricks , etc. et... MetaPost ! C’est ce que nous présentons ici à
30 partir de l'exemple
31 d'<http://melusine.eu.org/syracuse/metapost/animations/gerono/>.
32
33 Dans cet exemple, on paramétrise un certain point \(P = (\cos \theta,
34 \sin \theta)\) à l’aide du paramètre d’angel \(\theta\) qui permet de
35 construire le lemniscate de Gerono grâce à la recette suivante :
36
37
38 <div class="alert alert-info">
39 Soit \(P\) un point décrivant un cercle de centre \(O\) et de rayon
40 \(a\). On projette \(P\) en \(Q\) sur l’axe \((Ox)\), puis \(Q\) en
41 \(R\) sur le segment \([OP]\). Le lemniscate de Gerono est alors le
42 lieu du point \(M\) de \([PQ]\) tel que \(QM = QN\).
43 </div>
44
45 À partir de là, on construit la commande qui prend pour argument la
46 valeur de l’angle, et qui construit l’image correspondante. On va ici
47 utiliser l’*héritage* qui permet de garder en mémoire les
48 unités et la courbe construite au fur et à mesure, à partir des étapes
49 précédentes.
50
51 On encapsule le code MetaPost dans un *macro* LaTeX grâce à
52 l'environnement `mplibcode` de `luamplib`.
53
54 ~~~~~~~ { .latex }
55 \mplibcodeinherit{enable} % l'héritage pour la mémoire entre les figures
56 \newcommand{\lemniscate}[1]{% #1: l'angle en degres
57   \begin{mplibcode}
58     if(#1=0):
59     u:=3cm;%
60     a:=2u;%
61     h:=a/4;%
62     s:=1.3;%
63     path lemn;%
64     path carre;%
65     carre = (0,0)--(1,0)--(1,1)--(0,1)--cycle;
66     fi;
67     beginfig(#1);
68     pickup pencircle scaled 0.6pt;
69     drawarrow (0,-s*u)--(0,s*u);
70     drawarrow (-s*u,0)--(s*u,0);
71     path cercle,hori,verti;
72     pair O,P,Q,R,M;
73     O:=(0,0);
74     cercle := fullcircle scaled (a);
75     pickup pencircle scaled 0.4pt;
76     draw cercle dashed evenly withcolor blue;
77     P:=(a/2*cosd(#1),a/2*sind(#1)); % chemin qui parcourt le cercle
78     Q:=(a/2*cosd(#1),0); %projection sur (Ox)
79     % projection de Q sur [O,P]
80     R = cosd(#1)*cosd(#1)*(a/2*cosd(#1),a/2*sind(#1));
81     % M sur [PQ] tel que QM = QR
82     QR := abs(R-Q);
83     if(sind(#1)>0.0):
84     M = Q + (0,QR);
85     else:
86     M = Q - (0,QR);
87     fi;
88
89     if #1=0:
90     lemn:=M;
91     else:
92     lemn:= lemn--M;
93     fi;
94
95     if ((#1>0) and (#1<90)) or ((#1>180) and (#1<270)):
96     draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
97     draw carre scaled 6 rotated (angle(R-P)) shifted R;
98     fi;
99     if((#1>=90) and (#1<180)) or ((#1>=270) and (#1<360)):
100     draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
101     draw carre scaled 6 rotated (angle(R-P)+180) shifted R;
102     fi;
103
104     draw O--P dashed evenly withcolor blue;
105     draw P--Q dashed evenly withcolor blue;
106     draw R--Q--M withcolor green;
107
108     label.lrt(btex $a$ etex, (a/2,0));
109     label.llft(btex $x$ etex, (s*u,0));
110     label.llft(btex $y$ etex, (0,s*u));
111     label(btex \itshape Lemniscate \par de Gerono etex, (-0.7u,1.15u));
112     label(btex $x^4=a^2(x^2-y^2)$ etex, (0.7u,-1.15u));
113
114     dotlabel.llft(btex $O$ etex, O);
115     dotlabel.urt(btex $M$ etex, M);
116     dotlabel.urt(btex $P$ etex, P);
117     dotlabel.urt(btex $Q$ etex, Q);
118     dotlabel.urt(btex $R$ etex, R);
119
120     pickup pencircle scaled 1pt;
121     draw lemn withcolor red;
122
123     clip currentpicture to (-s*u,-s*u)--(s*u,-s*u)--(s*u,s*u)--(-s*u,s*u)--cycle;
124     endfig;
125   \end{mplibcode}
126 }
127 ~~~~~~~
128
129 Il suffit alors de construire l'animation avec l'extension `animate`
130 et son  environnement `animateinline`.
131
132 ~~~~~~~ { .latex }
133 \begin{center}
134 \begin{animateinline}[poster=230, controls]{24}
135   \multiframe{360}{ii=0+1}{\lemniscate{\ii}}
136 \end{animateinline}
137 \end{center}
138 ~~~~~~~

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.