Création de mng (images animées) avec metapost
par
popularité : 1%

Dans le programme de seconde, on demande aux élÚves d’afficher la courbe de la fonction sinus. Avec metapost et ImageMagik, rien de plus facile...
Petits rappels sur metapost
Nous avions découvert comment produire des figures géométriques dans l’article "Une approche de metapost", nous avions
vu aussi qu’un fichier source pouvait contenir plusieurs définitions de figures et donc engendrer
plusieurs fichiers d’images au format PostScript.
On se souvient aussi que les variables sont par défaut globales et donc se conservent d’une image à
l’autre (à moins qu’on invoque les commandes de déclarations de type sur elles).
Objectif
Dans le programme de seconde, on demande aux élèves d’afficher la courbe de la fonction sinus
(par exemple). Je vous propose donc d’élaborer une animation où on voit la courbe de la fonction se
dessiner en même temps que le déplacement d’un point sur un cercle trigonométrique le tout sur une
période, c’est-à-dire 2*pi.
Code commenté metapost
% metapost travaille en degrés donc nous définissons
% une petite fonction de conversion en radian
vardef conversion (expr monangle) =
monangle*3.14159265359/180
enddef;
beginfig(1);
pair O,O';
path cercle,axe[];
picture FigureInit;
rayon=2cm;
O=origin;
% la figure de gauche : le cercle trigo
cercle=fullcircle scaled (2*rayon);
axe0=(0,-1.1*rayon)--(0,1.1*rayon);
axe1=(-1.1*rayon,0)--(1.1*rayon,0);
pickup pencircle scaled .5bp;
draw cercle;
for i=0,1 :
drawarrow axe[i];
endfor
% la figure de droite : le repère pour tracer la fonction
O'=(rayon+1cm,0);
axe2=axe0 shifted O';
axe3=O'shifted (-.5cm,0)--O' shifted (6.5*rayon,0);
for i=2,3 :
drawarrow axe[i];
endfor
% on enregistre cette figure
FigureInit=currentpicture;
endfig;
% Déclaration de la courbe commune à toutes les figures.
path courbeSinus;
% Celle-ci commence à l'origine du repère
courbeSinus=O';
% Nombre de figures à créer
% Plus le nombre est grand, plus grande sera la précision
% de la courbe.
jmax=20;
% Boucle des figures
for j=1 upto jmax :
beginfig(0+j);
pair Mcercle,Maxe,Mcourbe;
% je retrace la figure 1 (le fond)
draw FigureInit;
% le calcul de l'angle en degrés
% 360/(jmax-1) désigne l'angle de rotation d'incrément
% (on retranche 1 pour démarrer l'angle à 0)
monangle:=(360/(jmax-1))*(j-1);
% pour mettre le point sur la courbe, son abscisse
% doit être en radian (c'est plus simple vu que j'ai l'unité
% rayon déjà toute prête)
% Le point Maxe est le projeté orthogonal de Mcercle sur l'axe
% des abscisses dans le repère du cercle.
Mcercle=(cosd(monangle)*rayon,sind(monangle)*rayon);
Maxe=(cosd(monangle)*rayon,0);
Mcourbe=(conversion(monangle)*rayon,sind(monangle)*rayon) shifted O';
draw Mcercle--Maxe;
draw Mcercle withpen pencircle scaled 4 bp withcolor red;
% La courbe s'allonge proportionnellment à j
courbeSinus:=courbeSinus--Mcourbe;
draw courbeSinus withcolor .5red;
draw Mcourbe withpen pencircle scaled 4 bp withcolor red;
endfig;
endfor
end
Vous remarquerez qu’ici nous écrasons la figure 1 dès j=1
, cela nous permet
d’éviter l’apparition de figures parasites à éliminer après compilation par metapost ; la figure 1 ne
servant qu’à initialiser la variable FigureInit
, notre fond.
Production de l’animation
La compilation du code nous fournit donc 20 fichiers images ; mon fichier source s’appelant Sinus.mp
, la compilation a fourni : Sinus.1
, Sinus.2
, etc. jusqu’à Sinus.20
.
Pour convertir ces images en une seule image animée, nous allons utiliser le logiciel ImageMagick et sa commande magique (évidemment) convert.
La lecture de la page de manuel de cette commande vaut le détour, le nombre de formats supportés est incroyable.
La commande convert
appliquée directement aux fichiers images metapost fonctionne (n’oublions pas que les formats d’images sont (quasiment) des fichiers PostScript) :
convert -delay 10 Sinus.* Sinus.mng
Hélas, l’ordre des figures n’est pas respecté !!
On a donc recours soit à la commande exhaustive :
bash-2.05$ convert -delay 10 Sinus.1 Sinus.2 Sinus.3 Sinus.4 Sinus.5 Sinus.6 Sinus.7 Sinus.8 Sinus.9 Sinus.10 Sinus.11 Sinus.12 Sinus.13 Sinus.14 Sinus.15 Sinus.16 Sinus.17 Sinus.18 Sinus.19 Sinus.20 Sinus.mng
soit au renommage des fichiers Sinus.1
jusqu’à Sinus.9
en Sinus.01
à Sinus.09
(merci Fred) ce qui nous assurera le respect de l’ordre des figures grâce à la commande :
convert -delay 10 Sinus.* Sinus.mng
Puis on visualise le résultat avec la commande animate
d’ImageMagick :
bash-2.05$ animate Sinus.mng
ou dans un navigateur Internet supportant les fichiers mng, comme Mozilla.
netographie
Commentaires