f8f6d6a89a7c9d5228c44678e6e973e71b59e2f1
[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 <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 <http://melusine.eu.org/syracuse/metapost/animations/gerono/>.
31
32 Dans cet exemple, on paramétrise un certain point \(P = (\cos \theta,
33 \sin \theta)\) à l’aide du paramètre d’angel \(\theta\) qui permet de
34 construire le lemniscate de Gerono grâce à la recette suivante :
35
36
37 <div class="alert alert-info">
38 Soit \(P\) un point décrivant un cercle de centre \(O\) et de rayon
39 \(a\). On projette \(P\) en \(Q\) sur l’axe \((Ox)\), puis \(Q\) en
40 \(R\) sur le segment \([OP]\). Le lemniscate de Gerono est alors le
41 lieu du point \(M\) de \([PQ]\) tel que \(QM = QN\).
42 </div>
43
44 À partir de là, on construit la commande qui prend pour argument la
45 valeur de l’angle, et qui construit l’image correspondante. On va ici
46 utiliser l’*héritage* qui permet de garder en mémoire les
47 unités et la courbe construite au fur et à mesure, à partir des étapes
48 précédentes.
49
50 On encapsule le code MetaPost dans un *macro* LaTeX grâce à
51 l'environnement `mplibcode` de `luamplib`.
52
53 ~~~~~~~ { .LaTeX }
54 \mplibcodeinherit{enable} % l'héritage pour la mémoire entre les figures
55 \newcommand{\lemniscate}[1]{% #1: l'angle en degres
56   \begin{mplibcode}
57     if(#1=0):
58     u:=3cm;%
59     a:=2u;%
60     h:=a/4;%
61     s:=1.3;%
62     path lemn;%
63     path carre;%
64     carre = (0,0)--(1,0)--(1,1)--(0,1)--cycle;
65     fi;
66     beginfig(#1);
67     pickup pencircle scaled 0.6pt;
68     drawarrow (0,-s*u)--(0,s*u);
69     drawarrow (-s*u,0)--(s*u,0);
70     path cercle,hori,verti;
71     pair O,P,Q,R,M;
72     O:=(0,0);
73     cercle := fullcircle scaled (a);
74     pickup pencircle scaled 0.4pt;
75     draw cercle dashed evenly withcolor blue;
76     P:=(a/2*cosd(#1),a/2*sind(#1)); % chemin qui parcourt le cercle
77     Q:=(a/2*cosd(#1),0); %projection sur (Ox)
78     % projection de Q sur [O,P]
79     R = cosd(#1)*cosd(#1)*(a/2*cosd(#1),a/2*sind(#1));
80     % M sur [PQ] tel que QM = QR
81     QR := abs(R-Q);
82     if(sind(#1)>0.0):
83     M = Q + (0,QR);
84     else:
85     M = Q - (0,QR);
86     fi;
87
88     if #1=0:
89     lemn:=M;
90     else:
91     lemn:= lemn--M;
92     fi;
93
94     if ((#1>0) and (#1<90)) or ((#1>180) and (#1<270)):
95     draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
96     draw carre scaled 6 rotated (angle(R-P)) shifted R;
97     fi;
98     if((#1>=90) and (#1<180)) or ((#1>=270) and (#1<360)):
99     draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
100     draw carre scaled 6 rotated (angle(R-P)+180) shifted R;
101     fi;
102
103     draw O--P dashed evenly withcolor blue;
104     draw P--Q dashed evenly withcolor blue;
105     draw R--Q--M withcolor green;
106
107     label.lrt(btex $a$ etex, (a/2,0));
108     label.llft(btex $x$ etex, (s*u,0));
109     label.llft(btex $y$ etex, (0,s*u));
110     label(btex \itshape Lemniscate \par de Gerono etex, (-0.7u,1.15u));
111     label(btex $x^4=a^2(x^2-y^2)$ etex, (0.7u,-1.15u));
112
113     dotlabel.llft(btex $O$ etex, O);
114     dotlabel.urt(btex $M$ etex, M);
115     dotlabel.urt(btex $P$ etex, P);
116     dotlabel.urt(btex $Q$ etex, Q);
117     dotlabel.urt(btex $R$ etex, R);
118
119     pickup pencircle scaled 1pt;
120     draw lemn withcolor red;
121
122     clip currentpicture to (-s*u,-s*u)--(s*u,-s*u)--(s*u,s*u)--(-s*u,s*u)--cycle;
123     endfig;
124   \end{mplibcode}
125 }
126 ~~~~~~~
127
128 Il suffit alors de construire l'animation avec l'extension `animate`
129 et son  environnement `animateinline`.
130
131 ~~~~~~~ { .latex }
132 \begin{center}
133 \begin{animateinline}[poster=230, controls]{24}
134   \multiframe{360}{ii=0+1}{\lemniscate{\ii}}
135 \end{animateinline}
136 \end{center}
137 ~~~~~~~

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.