Page 1 sur 3

[Résolu]Image fixe dans une animation

Posté : ven. 6 août 2010, 20:33
par chellier
Dans l'animation suivante, j'ai une partie "fixe" que je stocke dans une picture pic.
Dans les boucles, elle est ajoutée à chaque pas (puisqu'effacée à la fin de chaque pas : erase();).
N'y aurait-il pas moyen de dessiner l'animation "au-dessus", et donc de ne pas être obligé de la rajouter à chaque fois ?

Code : Tout sélectionner

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

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

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

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

animation A;
// --------------------------------------------------------------------------
for (real p=-1; p<=1; p+=.1) {
  add(pic);             // Ajout de l'image fixe
  trace(Cf1,pinit);
// ---------------------------------------
  draw(xscale(-p)*Cf1,pinit);
  A.add();
  erase();
}
// --------------------------------------------------------------------------
for (real t=0; t<=2pi; t+=pi/25) {
  add(pic);
  trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec);
// ---------------------------------------
  draw(shift(t,0)*Cf2,pf);
  A.add();
  erase();
}
// --------------------------------------------------------------------------
for (real t=0; t<=2pi; t+=pi/25) {
  add(pic);
  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();
  erase();
}

label(A.pdf(delay=100,"controls"));
//A.movie();

Merci,
Christophe

Re: Image fixe dans une animation

Posté : ven. 6 août 2010, 20:44
par GM
Sans avoir testé ton code, si tu n'utiles qu'erase... je te signale qu'il existe : le couple de fonctions save et restore.
Des exemples ici : http://www.marris.org/asymptote/animations/index.html

Re: Image fixe dans une animation

Posté : ven. 6 août 2010, 20:49
par chellier
GM a écrit :Sans avoir testé ton code, si tu n'utiles qu'erase... je te signale qu'il existe : le couple de fonctions save et restore.


Oui, mais je ne vois pas bien comment l'utiliser pour ma partie fixe, sans affecter la partie animation qui justement doit être effacée à chaque pas... Mais je vais essayer encore :(

Christophe

Re: Image fixe dans une animation

Posté : ven. 6 août 2010, 21:41
par chellier
Avec le couple save() et restore(), je me retrouve avec la figure terminée et au-dessus, en décalé, l'animation...

Christophe

Re: Image fixe dans une animation

Posté : ven. 6 août 2010, 21:45
par GM
Je viens de regarder ton code : je ne vois pas trop ce que tu pourras gagner à changer.

Il me semble que l'effet d'un save/restore ne sera pas mieux que ton add(pic).

On ne peut pas dire que tu retraces la partie fixe à chaque fois... : ce que tu fais s'apparente pour moi aussi à la restauration d'une sauvegarde d'un état.
Je dis cela sans savoir comment cela fonctionne au niveau mémoire.

Quand j'ai fait les exemples de la galerie, j'ai aussi bien bricolé parfois... car il y a parfois des problèmes de tailles et de superpositions décalées.
Cela n'est pas plus performant que ta méthode mais voilà une variante :

Code : Tout sélectionner

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

real f(real x) {return cos(x);}
path Cf1=graph(f,0,pi,n=400);
path Cf2=graph(f,-pi,pi,n=400);
path Cf3=graph(f,pi,3pi,n=400);
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));

animation A;
// --------------------------------------------------------------------------
for (real p=-1; p<=1; p+=.1) {
  save();
  trace(Cf1,pinit);
  draw(xscale(-p)*Cf1,pinit);
  picture pic;
  add(pic,bbox(1mm,Fill(paleblue+white)));
  A.add(pic);
  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);
  picture pic;
  add(pic,bbox(1mm,Fill(paleblue+white)));
  A.add(pic);
  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);
  picture pic;
  add(pic,bbox(1mm,Fill(paleblue+white)));
  A.add(pic);
  restore();
}

label(A.pdf(delay=100,"controls"));

Re: Image fixe dans une animation

Posté : ven. 6 août 2010, 21:47
par GM
chellier a écrit :avec la figure terminée et au-dessus, en décalé, l'animation...

Tiens, c'est ce que je viens de te signaler dans mon message précédent. Sois le bienvenu au club. :D

Re: Image fixe dans une animation

Posté : ven. 6 août 2010, 22:06
par chellier
Ouf, j'ai mis du temps à comprendre... C'est bien ce que j'avais essayé de faire, mais avec ton code, je n'avais pas de décalage, alors qu'avec le mien, j'en avais :shock:
En fait il y a aussi un décalage avec le tien, mais la bbox le cache :!:

Bon, finalement, je vais en rester avec ma première méthode, j'avais juste espoir de faire baisser un peu la taille du fichier :roll:

Merci pour l'aide,

Christophe

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

Posté : ven. 6 août 2010, 22:09
par GM
Une variante plus simple :

Code : Tout sélectionner

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

real f(real x) {return cos(x);}
path Cf1=graph(f,0,pi,n=400);
path Cf2=graph(f,-pi,pi,n=400);
path Cf3=graph(f,pi,3pi,n=400);
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));

animation A;
// --------------------------------------------------------------------------
for (real p=-1; p<=1; p+=.1) {
  save();
  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();
}

label(A.pdf(BBox(1mm,Fill(paleblue+white)),delay=100,"controls"));
//A.movie();

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

Posté : ven. 6 août 2010, 22:22
par chellier
En fait, tout ça est équivalent en terme de "poids", mais c'est intéressant de comparer différentes méthodes.

Christophe

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

Posté : ven. 6 août 2010, 22:26
par GM
GM a écrit :Une variante plus simple :

Avec

Code : Tout sélectionner

label(A.pdf(BBox(Fill(white)),delay=100,"controls"));

pour avoir le même rendu que ton exemple initial, j'obtiens un pdf qui a le poids du tien 1,38.. Mo + 8ko.
8ko, c'est bien moins que la taille du fichier que l'on obtient avec uniquement l'image fixe.
Donc comment l'expliquer... ?

Enfin bref... ta méthode était très bien. ;-)