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

, 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/

Navigation

ThèmesTous les tags

206/900
94/900
900/900
128/900
117/900

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

Sites favoris Tous les sites

96 sites référencés dans ce secteur

Brèves Toutes les brèves