[Résolu]Image fixe dans une animation

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
Avatar du membre
chellier
Messages : 101
Enregistré le : jeu. 18 mars 2010, 17:30

[Résolu]Image fixe dans une animation

Message non lu par chellier » ven. 6 août 2010, 20:33

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
Modifié en dernier par chellier le ven. 6 août 2010, 22:06, modifié 1 fois.

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

Re: Image fixe dans une animation

Message non lu par GM » ven. 6 août 2010, 20:44

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
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
chellier
Messages : 101
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Image fixe dans une animation

Message non lu par chellier » ven. 6 août 2010, 20:49

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

Avatar du membre
chellier
Messages : 101
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Image fixe dans une animation

Message non lu par chellier » ven. 6 août 2010, 21:41

Avec le couple save() et restore(), je me retrouve avec la figure terminée et au-dessus, en décalé, l'animation...

Christophe

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

Re: Image fixe dans une animation

Message non lu par GM » ven. 6 août 2010, 21:45

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"));
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

Re: Image fixe dans une animation

Message non lu par GM » ven. 6 août 2010, 21:47

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
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
chellier
Messages : 101
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Image fixe dans une animation

Message non lu par chellier » ven. 6 août 2010, 22:06

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

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

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

Message non lu par GM » ven. 6 août 2010, 22:09

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();
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
chellier
Messages : 101
Enregistré le : jeu. 18 mars 2010, 17:30

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

Message non lu par chellier » ven. 6 août 2010, 22:22

En fait, tout ça est équivalent en terme de "poids", mais c'est intéressant de comparer différentes méthodes.

Christophe

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

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

Message non lu par GM » ven. 6 août 2010, 22:26

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. ;-)
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

Répondre