Page 3 sur 3

Re: [Résolu]Image fixe dans une animation

Posté : mar. 10 août 2010, 06:21
par chellier
Allez, encore une version ;)
J'ai récupéré les dimensions de la bounding box de l'image fixe. Je trace une "box" aux dimensions précédentes dans la première image de l'animation... et il n'y a plus de décalage, enfin presque :roll: Les boutons de contrôle mettent le bazar. Il y a encore un décalage à cause d'eux. Solution : ne pas les mettre. Il suffit alors de cliquer sur l'image pour lancer l'animation, mais on peut plus "jouer" avec :( Taille : 414894 octets. Ce qui est excellent pour moi (c'est presque 1Mo de moins que la figure de départ...)!

Code : Tout sélectionner

import graph_pi;
import animate;
settings.tex="pdflatex";
settings.outformat="pdf";
usepackage("fourier","upright");

pair mini, maxi;
real f(real x) {return cos(x);}
path Cf1=graph(f,0,pi,n=20,Hermite);
path Cf2=graph(f,-pi,pi,n=20,Hermite);
path Cf3=graph(f,pi,3pi,n=20,Hermite);
transform sc=scale(.8);
pen pinit=1.2bp+magenta, pf=1.2bp+.8blue, pvec=bp+deepgreen;

void trace(path f, pen p, Label L="", real r=0, real per=2pi, pair NS=(0,0),
           pen pv=nullpen, arrowbar arrow=Arrow(HookHead,2mm)){
  draw(f,p);
  if (NS!=(0,0))
    draw(Label(sc*L,Fill(white),align=NS),(r,f(r))--(r+per,f(r+per)),pv,arrow);
}

graphicrules(xunit=1cm, yunit=1cm, xmin=-3pi, xmax=3pi, ymin=-1.5, ymax=1.5);
add(millimeterpaper(p=1bp+orange),(0,0));
labeloij(Lo=sc*"$O$", Li=sc*"$\overrightarrow{\imath}$", Lj=sc*"$\overrightarrow{\jmath}$");
cartesianaxis(xticks=Ticks(sc*Label(Fill(white)),
                           labelfrac(factor=pi,symbol="\pi",symbolin=true,zero=false),
                        Step=pi/2, ptick=black),
              yticks=Ticks(sc*Label(Fill(white)),labelfrac(zero=false),Step=1,step=.5));

picture pic; 
pic.add(currentpicture);// Sauvegarde de l'image fixe dans pic

mini=min(pic)/cm; maxi=max(pic)/cm; // coordonnées de la "bounding box" (gauche,bas) et (droite,haut)

erase();
animation A;
// --------------------------------------------------------------------------
for (real p=-1; p<=1; p+=.1) {
  save();
  if (p==-1){draw(box(mini,maxi),(0,0),invisible);} // boîte aux dimension de l'image fixe
  trace(Cf1,pinit);
  draw(xscale(-p)*Cf1,pinit);
  A.add();
  restore();
}
for (real t=0; t<=2pi; t+=pi/25) {
  save();
  trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
  draw(shift(t,0)*Cf2,pf);
  A.add();
  restore();
}
for (real t=0; t<=2pi; t+=pi/25) {
  save();
  trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
  trace(Cf3,pf,"$-2\pi \vec{\imath}$",-pi,-2pi,S,pvec);
  draw(shift(-t,0)*Cf2,pf);
  A.add();
  restore();
}

add(pic);
label(A.pdf(delay=100));


Si quelqu'un a une solution pour les boutons de contrôle...

Christophe

Edit : je signale quand même, même si ce n'est pas le sujet ici, que, pour que l'animation soit "exacte", il faut que le dernier compteur commence à pi/25 :

Code : Tout sélectionner

for (real t=pi/25; t<=2pi; t+=pi/25) {