Création de mng (images animées) avec metapost

lundi 9 décembre 2002
par  David Cobac
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

http://www.imagemagick.org/


Commentaires

Logo de pauline
vendredi 23 septembre 2005 à 23h42 - par  pauline

natty et pauline , meilleurs amies.....

Logo de DaffyDuke
jeudi 12 décembre 2002 à 16h03 - par  DaffyDuke

Attention, concernant Internet Explorer et autres joyeusetés windowsiennes, une importante faille de sécurité concernant les librairies PNG vient de paraître. Consultez le site de Microsoft !

mardi 10 décembre 2002 à 12h42 - par  asr

Attention, IE ne sait pas gérer correctement les images au format MNG. Un pluggin existe pour corriger cette absence, cela oblig toutefois les webmestres à ne pas considérer les fichiers MNG comme des images (type gif) mais comme des fichiers "embed" de type vidéo.

De ce fait, les vieux navigateurs tels que Netscape 4.7 ou IE3 ne savent plus les lire non plus.

Voir aussi les commentaires sur l’article Une approche de metapost

Annonces

Annuaire LibreNord

Retrouvez l’annuaire de logiciels libres créé par l’association Club Linux Nord-Pas de Calais sur le site suivant http://www.librenord.org