Luamplib et animate
[luatex.git] / luamplibAnimate / page.md
diff --git a/luamplibAnimate/page.md b/luamplibAnimate/page.md
new file mode 100644 (file)
index 0000000..5be9269
--- /dev/null
@@ -0,0 +1,138 @@
+<div class="alert alert-info">
+<p>Grâce à l'extension `luamplib` pour Lua(La)TeX et
+l'extension `animate`, on peut réaliser très facilement des
+animations avec MetaPost, lisibles dans an PDF avec *Acrobat
+Reader*. En effet, `luamplib` nous permet de créer des
+figures avec l'environnement `mplibcode` qu'on anime avec
+l'environnement `animateinline`.
+
+Les documentations des deux
+extensions utilisées  :
+
+* [`luamplib`](http://mirror.hmc.edu/ctan/macros/luatex/generic/luamplib/luamplib.pdf
+"lien vers le pdf")
+* [`animate`](http://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/ctan/macros/latex/contrib/animate/animate.pdf
+"lien vers le pdf").
+
+</div>
+
+* La compilation se fait avec : `lualatex mplibanimate.tex`.
+* Le code MetaPost est extrait de l'<http://melusine.eu.org/syracuse/metapost/animations/gerono/>
+
+## Explications
+
+L’extension animate permet de générer des animations lisibles dans un
+PDF par le lecteur *Acrobat Reader*. 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'<http://melusine.eu.org/syracuse/metapost/animations/gerono/>.
+
+Dans cet exemple, on paramétrise un certain point \(P = (\cos \theta,
+\sin \theta)\) à l’aide du paramètre d’angel \(\theta\) qui permet de
+construire le lemniscate de Gerono grâce à la recette suivante :
+
+
+<div class="alert alert-info">
+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\).
+</div>
+
+À 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’*héritage* qui permet de garder en mémoire les
+unités et la courbe construite au fur et à mesure, à partir des étapes
+précédentes.
+
+On encapsule le code MetaPost dans un *macro* LaTeX grâce à
+l'environnement `mplibcode` de `luamplib`.
+
+~~~~~~~ { .latex }
+\mplibcodeinherit{enable} % l'héritage pour la mémoire entre les figures
+\newcommand{\lemniscate}[1]{% #1: l'angle en degres
+  \begin{mplibcode}
+    if(#1=0):
+    u:=3cm;%
+    a:=2u;%
+    h:=a/4;%
+    s:=1.3;%
+    path lemn;%
+    path carre;%
+    carre = (0,0)--(1,0)--(1,1)--(0,1)--cycle;
+    fi;
+    beginfig(#1);
+    pickup pencircle scaled 0.6pt;
+    drawarrow (0,-s*u)--(0,s*u);
+    drawarrow (-s*u,0)--(s*u,0);
+    path cercle,hori,verti;
+    pair O,P,Q,R,M;
+    O:=(0,0);
+    cercle := fullcircle scaled (a);
+    pickup pencircle scaled 0.4pt;
+    draw cercle dashed evenly withcolor blue;
+    P:=(a/2*cosd(#1),a/2*sind(#1)); % chemin qui parcourt le cercle
+    Q:=(a/2*cosd(#1),0); %projection sur (Ox)
+    % projection de Q sur [O,P]
+    R = cosd(#1)*cosd(#1)*(a/2*cosd(#1),a/2*sind(#1));
+    % M sur [PQ] tel que QM = QR
+    QR := abs(R-Q);
+    if(sind(#1)>0.0):
+    M = Q + (0,QR);
+    else:
+    M = Q - (0,QR);
+    fi;
+
+    if #1=0:
+    lemn:=M;
+    else:
+    lemn:= lemn--M;
+    fi;
+
+    if ((#1>0) and (#1<90)) or ((#1>180) and (#1<270)):
+    draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
+    draw carre scaled 6 rotated (angle(R-P)) shifted R;
+    fi;
+    if((#1>=90) and (#1<180)) or ((#1>=270) and (#1<360)):
+    draw carre scaled 6 rotated (angle(Q-P)+180) shifted Q;
+    draw carre scaled 6 rotated (angle(R-P)+180) shifted R;
+    fi;
+
+    draw O--P dashed evenly withcolor blue;
+    draw P--Q dashed evenly withcolor blue;
+    draw R--Q--M withcolor green;
+
+    label.lrt(btex $a$ etex, (a/2,0));
+    label.llft(btex $x$ etex, (s*u,0));
+    label.llft(btex $y$ etex, (0,s*u));
+    label(btex \itshape Lemniscate \par de Gerono etex, (-0.7u,1.15u));
+    label(btex $x^4=a^2(x^2-y^2)$ etex, (0.7u,-1.15u));
+
+    dotlabel.llft(btex $O$ etex, O);
+    dotlabel.urt(btex $M$ etex, M);
+    dotlabel.urt(btex $P$ etex, P);
+    dotlabel.urt(btex $Q$ etex, Q);
+    dotlabel.urt(btex $R$ etex, R);
+
+    pickup pencircle scaled 1pt;
+    draw lemn withcolor red;
+
+    clip currentpicture to (-s*u,-s*u)--(s*u,-s*u)--(s*u,s*u)--(-s*u,s*u)--cycle;
+    endfig;
+  \end{mplibcode}
+}
+~~~~~~~
+
+Il suffit alors de construire l'animation avec l'extension `animate`
+et son  environnement `animateinline`.
+
+~~~~~~~ { .latex }
+\begin{center}
+\begin{animateinline}[poster=230, controls]{24}
+  \multiframe{360}{ii=0+1}{\lemniscate{\ii}}
+\end{animateinline}
+\end{center}
+~~~~~~~

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.