Page 1 sur 1

Insérer une pause dans une animation

Posté : mer. 30 mai 2012, 20:33
par etienne25
Ben voilà, tout est quasiment dit dans le sujet...

Je souhaite faire une animation en pdf avec Asymptote qui arrêterait à certains moments, le temps que j'explique mes trucs à mes étudiants, puis qui redémarrerait avec -par exemple- un clic de souris. Ce doit être simple, mais je ne trouve pas :oops: Quelqu'un pourrait me donner un lien vers un exemple où ce genre de chose est fait?

Merci!

Re: Insérer une pause dans une animation

Posté : mer. 30 mai 2012, 21:54
par GM
Pour l'exemple suivant :

Code : Tout sélectionner

import animate;
settings.tex="pdflatex";
settings.outformat="pdf";

size(7cm);
animation A;

void koch(pair A, pair B, int n) {
          pair C;
          C=rotate(120, point(A--B,1/3))*A;
          if (n>0) {
             koch(A,point(A--B,1/3),n-1);
             koch(point(A--B,1/3),C,n-1);
             koch(C,point(A--B,2/3),n-1);
             koch(point(A--B,2/3),B,n-1);
          }
          else draw(A--point(A--B,1/3)--C--point(A--B,2/3)--B);
}
 
pair z0=(1,0);
pair z1=rotate(120)*z0;
pair z2=rotate(120)*z1;
real pmax=4;
for (int p=0; p<=pmax; p+=1) {
  save();
  koch(z0,z1,p);
  koch(z1,z2,p);
  koch(z2,z0,p);
  A.add();
  erase();
}
label(A.pdf(BBox(1mm,nullpen),delay=500,"controls,loop"));


tu devrais obtenir ceci, avec des boutons de contrôle :
asy_2012_05_30_animation_avec_pause_fig1.pdf
(37.13 Kio) Téléchargé 451 fois

Re: Insérer une pause dans une animation

Posté : jeu. 31 mai 2012, 04:59
par etienne25
Bien, je peux faire une pause avec les contrôles, expliquer, puis redémarrer l'animation. Mais ce que j'aimerais, c'est que la pause se fasse toute seule. Pour ce flocon de Koch, serait-il possible de voir défiler, par exemple, les 2 premières itérations, puis que l'animation arrête d'elle-même, jusqu'à ce que je clique pour la redémarrer? Ça m'éviterait de me précipiter sur les contrôles pour arrêter l'animation au bon moment...

Re: Insérer une pause dans une animation

Posté : jeu. 31 mai 2012, 21:32
par GM
Je n'ai pas de fonction magique en tête et je manque beaucoup de pratique en matière d'animations donc il me faut chercher, tester...

... et j'ai actuellement un problème technique qui m'empêche de tester, s'il y aurait éventuellement moyen dans un "beamer" de présentation de mettre le début d'une animation dans une "frame" et la fin de l'animation dans la suivante.

Si quelqu'un a une idée, qu'il n'hésite pas à la donner à Etienne.
Je me pencherai sur le problème ce weekend si mes petits soucis techniques sont réglés.

Re: Insérer une pause dans une animation

Posté : ven. 1 juin 2012, 23:49
par GM
Un exemple bricolé... pour éventuellement dépanner.
Je réfléchirai à une solution plus élégante plus tard.

Code : Tout sélectionner

\documentclass[11pt]{beamer}
\usepackage[utf8]{inputenc}
\usetheme{Warsaw}
\usepackage[inline]{asymptote}
\usepackage{animate}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\begin{frame}[fragile]{Début de l'animation}
Cela commence maintenant...

\begin{asy}
import animate;
animation A=animation("movie1_A");
int n=12;
real h=2pi/n;

picture pic;
unitsize(pic,2cm);
for(int i=0; i < floor(n/2); ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),blue);
  A.add(pic);
}
for(int i=floor(n/2); i < n; ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),invisible);
}
A.add(pic);
label(A.pdf(delay=1000,options="autoplay"));
\end{asy}
\end{frame}

\begin{frame}[fragile]{Fin de l'animation...}
... et cela se termine quand je le décide.

\begin{asy}
import animate;
animation A=animation("movie1_B");
int n=12;
real h=2pi/n;

picture pic;
unitsize(pic,2cm);
for(int i=0; i < floor(n/2); ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),blue);
}
A.add(pic);
for(int i=floor(n/2); i < n; ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),red);
  A.add(pic);
}
label(A.pdf(delay=1000,options="autoplay"));
\end{asy}
\end{frame}
\end{document}


pour donner ceci :
tex_2012_06_01_beamer_animation_v1.pdf
(61.69 Kio) Téléchargé 413 fois

Attention : ce sera probablement à visualiser avec Acrobat reader, pour voir l'animation fonctionner.

Il faut changer de diapo pour voir la suite.

Pour ceux qui ne connaissent pas, je signale que, je me suis acheté ceci l'été dernier, pour pouvoir changer de diapo à distance : c'est bien pratique.
Image

Re: Insérer une pause dans une animation

Posté : sam. 2 juin 2012, 13:14
par etienne25
Oui, ça fonctionne très bien! Et ça me convient parfaitement. Mais si quelqu'un trouve comment le faire entièrement avec Asymptote, je serais très curieux de voir comment!

Re: Insérer une pause dans une animation

Posté : sam. 2 juin 2012, 15:18
par maurice
etienne25 a écrit :Mais si quelqu'un trouve comment le faire entièrement avec Asymptote, je serais très curieux de voir comment!


On peut utiliser l'extension slide :

Code : Tout sélectionner

orientation=Landscape;

settings.tex="pdflatex";

import slide;

// Optional movie modules:
import animate;     // For portable embedded PDF movies


usersetting();

titlepage("diaporama avec {\tt Asymptote}: Animations","GM, \'Etienn25, Maurice",
          "Forum Asymptote","\today","http://asy.gmaths.net/forum/");

title("Le d\'ebut de l'animation");
animation A=animation("movie1_A");
int n=12;
real h=2pi/n;

picture pic;
unitsize(pic,2cm);
for(int i=0; i < floor(n/2); ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),blue);
  A.add(pic);
}
for(int i=floor(n/2); i < n; ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),invisible);
}
A.add(pic);
label(A.pdf(delay=1000,options="autoplay"));

title("Tout de suite la suite ...");
animation A=animation("movie1_B");
int n=12;
real h=2pi/n;

picture pic;
unitsize(pic,2cm);
for(int i=0; i < floor(n/2); ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),blue);
}
A.add(pic);
for(int i=floor(n/2); i < n; ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),red);
  A.add(pic);
}
label(A.pdf(delay=1000,options="autoplay"));


qui donne :

pause-slide.pdf
(46.03 Kio) Téléchargé 420 fois


Dites moi si ça marche bien, comme je n'ai pas Adobe Reader d'installé en ce moment sous linux ....

Bruno

Re: Insérer une pause dans une animation

Posté : sam. 2 juin 2012, 15:44
par GM
maurice a écrit :On peut utiliser l'extension slide...

J'y avais pensé... car j'ai pratiqué cela, il y a 4 ans, avant même d'utiliser beamer mais comme personnellement j'ai abandonné slide pour la richesse des possibilités de beamer, je me voyais mal le conseiller. ;-)

[Résolu]Re: Insérer une pause dans une animation

Posté : mar. 5 juin 2012, 03:02
par etienne25
Ce qu'il y a de bien dans un forum, c'est que les idées des autres donnent des nouvelles pistes de recherche!!

maurice a écrit :
Dites moi si ça marche bien, comme je n'ai pas Adobe Reader d'installé en ce moment sous linux ....



C'est parfait! Ça m'a amené à fouiller sur l'extension slide que je ne connaissais pas, et j'ai trouvé la commande newpage(). Voici le code de Bruno auquel j'ai enlevé la «mécanique» de slide et ajouté un newpage():

Code : Tout sélectionner

orientation=Landscape;

settings.tex="pdflatex";

// Optional movie modules:
import animate;     // For portable embedded PDF movies


usersetting();

animation A=animation("movie1_A");
int n=12;
real h=2pi/n;

picture pic;
unitsize(pic,2cm);
for(int i=0; i < floor(n/2); ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),blue);
  A.add(pic);
}
for(int i=floor(n/2); i < n; ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),invisible);
}
A.add(pic);
label(A.pdf(delay=1000,options="autoplay"));

// ICI
newpage();

animation A=animation("movie1_B");
int n=12;
real h=2pi/n;

picture pic;
unitsize(pic,2cm);
for(int i=0; i < floor(n/2); ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),blue);
}
A.add(pic);
for(int i=floor(n/2); i < n; ++i) {
  draw(pic,expi(-i*h)--expi(-(i+1)*h),red);
  A.add(pic);
}
label(A.pdf(delay=1000,options="autoplay"));


On obtient alors juste l'animation, sans rien autour. En appuyant sur Enter, on change de page, et l'animation continue.

J'en profite pour poser quelques questions «théoriques». Le pdf que mon code crée, est-ce ce qu'on appelle un pdf multipages? À 2 pages? Ou bien est-ce que les animations sont en fait plusieurs pages (1 par frame), et donc mon pdf serait multipages à plus que 2 pages? Ou bien les animations sont des prc inclus dans un fichier pdf (ce serait là la tâche de la commande pdf(), peut-être...)? Pourquoi ne se passe-t-il rien (image vide) quand je crée le fichier tex suivant:

Code : Tout sélectionner

\documentclass{article}

\usepackage{animate}

\begin{document}
Le fichier que j'ai cr\'e\'e sur Asymptote s'appelle test.pdf. On dit dans la doc du package \textsf{animate} qu'on peut donner \`a la commande \texttt{\symbol{92}animategraphics} un pdf multipage pour faire une animation.

\animategraphics[controls]{2}{test}{}{}

Il n'y a rien! Mon pdf n'est-il pas multipage?
\end{document}


Je sais que ce sont des questions de base, mais il me semble que quand ça va être clair dans ma tête, il y a plein de choses que je vais comprendre dans les docs de latex (package animate) et d'Asymptote!!!

Re: Insérer une pause dans une animation

Posté : mar. 5 juin 2012, 03:49
par maurice
Bonsoir, dans le pdf de 2 pages que tu obtiens, chaque page contient une animation (qui n'est pas multipage).
tu paux remplacer au choix tes lignes :

Code : Tout sélectionner

label(A.pdf(delay=1000,options="autoplay"));


par :

Code : Tout sélectionner

label(A.pdf("<options>",keep=true,multipage=false));

pour obtenir un pdf par image.

Code : Tout sélectionner

label(A.pdf("<options>",keep=true,multipage=true));

pour obtenir l’animation et le pdf multipage (pdf contenant une page par image).

Code : Tout sélectionner

label(A.pdf("<options>"));

pour l’animation uniquement.

Code : Tout sélectionner

A.movie();

pour obtenir un pdf multipage.

Les options sont celles du package animate.

Pour plus de précisions, voir ici ou bien sur la doc officielle.

Bruno