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 :

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 = (, )) à l’aide du paramètre d’angel () qui permet de construire le lemniscate de Gerono grâce à la recette suivante :

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).

À 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.

\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.

\begin{center}
\begin{animateinline}[poster=230, controls]{24}
  \multiframe{360}{ii=0+1}{\lemniscate{\ii}}
\end{animateinline}
\end{center}