Page 1 sur 1

[Résolu] Package animate : Problème avec \multido

MessagePosté: Lundi 16 Avril 2007, 01:17
par francois
Bonjour à tous.

Je fais une petite animation avec le package animate, qui m'a l'air génial. En effet on peut faire des animations sur pdf avec du code PsTricks ! Je fais pour l'instant un truc bidon, je trace simplement la fonction puissance n sur [0;1] avec n qui devient de plus en plus grand (n=1, 2, 3, 4 etc).

Pour faire les "frames" (les photos qui forment l'animation), je m'y prends de deux manières, censées être identiques :
1) Avec une boucle while, avec \whiledo
2) Avec une boucle for, avec \multido

Voici mon code :
Code: Tout sélectionner
\documentclass{article}
\usepackage{animate}
\usepackage{graphics}
\usepackage{pstricks-add}
\psset{algebraic,unit=5cm,linewidth=2pt}

%% La fonction puissance n
\newcommand{\dessin}[1]{%
\begin{pspicture}(0,0)(1,1)
\psline(0,0)(0,1)(1,1)(1,0)(0,0)
\psplot[plotpoints=700]{0}{1}{x^(#1)}
\end{pspicture}}

\begin{document}

\centering
\newcounter{petitn}
\setcounter{petitn}{1}

\begin{animateinline}[poster=first,controls]{25}%
% La première frame
\dessin{\thepetitn}%
% Puis les autres frames avec la commande \whiledo
\whiledo{\thepetitn<50}{%
\newframe%
\addtocounter{petitn}{1}%
\dessin{\thepetitn}}
\end{animateinline}

\vspace{1cm}

\begin{animateinline}[poster=first,controls]{25}%
% La première frame
\dessin{\thepetitn}%
% Puis les autres frames avec la commande \multido
\multido{\i=2+1}{49}{%
\newframe%
\dessin{\thepetitn}}
\end{animateinline}

\end{document}


Je compile en LaTeX=>PS=>PDF (attention, sans l'option -Ppdf pour dvips, comme l'exige la doc de animate). Aucun message d'erreur, ni de warning. L'animation faite avec \whiledo marche très bien et celle avec \multido rien ! Pourquoi ?

C'est dommage car pour faire des animations la commande \multido serait plus pratique : pas besoin de compteur, et en plus la variable n'est pas forcément un entier.

Voici le lien de la doc du package animate. Je vous la donne parce que :
1) si ça peut vous faire découvrir ce package, tant mieux, je trouve qu'il peut être très puissant.
2) Cela peut éventuellement vous aider à répondre à ma question.
ftp://tug.ctan.org/pub/tex-archive/macros/latex/contrib/animate/doc/animate.pdf (pour la doc)
http://www.ctan.org/tex-archive/macros/latex/contrib/animate/ (pour avoir le package)

Merci d'avance.

MessagePosté: Lundi 16 Avril 2007, 18:54
par francois
J'interviens à nouveau pour dire que, d'après moi, la commande \multido ne supporte pas trop les changements paragraphes, ce qui est plus ou moins demandé avec \newframe. Peut-être que le problème vient de là.

Il me semble que les commandes du package animate ne sont pas trop compatibles avec celles du package fp, bien pratique pour faire des calculs.

MessagePosté: Lundi 16 Avril 2007, 21:43
par rebouxo
Non, la commande \multido supporte très bien les sauts de paragraphe et même de page, de photo, etc.

Je n'utilse pas animate. J'ai l'impression que c'est un peu instable encore.

Olivier

MessagePosté: Lundi 16 Avril 2007, 21:50
par gigiair
francois a écrit:J'interviens à nouveau pour dire que, d'après moi, la commande \multido ne supporte pas trop les changements paragraphes, ce qui est plus ou moins demandé avec \newframe. Peut-être que le problème vient de là.

Il me semble que les commandes du package animate ne sont pas trop compatibles avec celles du package fp, bien pratique pour faire des calculs.

C'est plutôt un problème de \newframe.
J'ai essayé avec \foreach du package pgffor (appelé par tikz).
\newframe déclenche une erreur. L'auteur du package a pris soin dans sa doc d'utiliser \whiledo. il n'ignore pas l'existence de \multido, ni de \foreach, ça c'est sûr.
Il doit donc bien y avoir une raison. Il faudra attendre un peu pour utiliser \multido.

MessagePosté: Mardi 17 Avril 2007, 00:30
par francois
Bonjour à tous.

la commande \multido supporte très bien les sauts de paragraphe
Pourtant quand je tape :
Code: Tout sélectionner
\multido{\n=1+1}{5}{Il y a $\n$ chaussures.\par}
j'ai des erreurs venant de \par.

Sinon, certes, pour le moment \multido et animate ne sont pas compatibles et il faut utiliser \whiledo. Mais je me suis dit que les compteurs c'est bien gentils mais moi je voulais manipuler des nombres décimaux (plus pratiques pour faire de subtiles animations). Alors j'ai repris le code du message du début et j'ai seulement remplacé le compteur \petitn par \n un décimal, et cela grâce au package fp (pour faire des calculs) ; ce qui donne :

Code: Tout sélectionner
\documentclass{article}
\usepackage{animate}
\usepackage{graphics}
\usepackage{pstricks-add}
\usepackage{fp}
\psset{algebraic,unit=2cm,linewidth=2pt}

\newcommand{\dessin}[1]{%
\begin{pspicture}(0,0)(1,1)
\psline(0,0)(0,1)(1,1)(1,0)(0,0)
\psplot[plotpoints=700]{0}{1}{x^(#1)}
\end{pspicture}}

\begin{document}\centering

\FPset{\n}{1} %Mon nouveau compteur qui sera un décimal

\begin{animateinline}[poster=first,controls]{25}%
% La première frame
\dessin{\n}%
% Puis les autres frames avec la commande \whiledo
\whiledo{\n<50}{%
%\newframe%
\FPset{\n}{\n+0.5}%
\dessin{\n}}
\end{animateinline}

\end{document}

Et là que de messages d'erreurs. C'est dommage. Déjà que ce package est compatible avec PsTricks. S'il y avait compatibilité du package animate avec \multido et le package fp (pour faire des calculs), ce serait GENIAL !

Celui qui a fait ce package s'appelle Alexander Grahn. Je l'ai vu sur ce forum. J'espère qu'il va lire ce post et vite nous rectifier tout ça ! :lol:

MessagePosté: Mardi 17 Avril 2007, 07:59
par a.grahn
Bonjour `a tous,
malheureusement, je n'ai pas encore trouvé la raison qui fait échouer animate avec fp et multido. Merci de votre patience...
Alex

MessagePosté: Mardi 17 Avril 2007, 13:37
par a.grahn
Bon, le package `multido' utilise internement le macro \FPadd dont l'implémentation il s'emprunte du package `fp'. Il semble que le résultat d'une opération `\FPadd' n'a pas de portée globale et sera oublie au moment de re-parcourier les commandes d'un boucle. Alors, \multido échoue a cause de son faible implémentation et ne peut pas utilisé ici.

Par contre, \multido ne peut, lui aussi, pas faire de répétitions non-intégrales. En fait, c'est le 2eme argument de la commande \multido qui détermine le nombre (intégrale) de répétitions. Alors, multido peut être remplace facilement par \whiledo. Et le reste, c'est a dire l'évaluation du 1er argument, par exemple l'augmentation d'une variable non-intégrale, peut être effectué a l'aide des commandes fournis par le package `fp'. Comme la valeur courante d'une variable sera oubliée a la fin d'un boucle, il faut en faire une copie a portée globale. Voir l'exemple ci-dessous.

J'espère que cela t'a pu aider résoudre ton problème. Pour résumer, il serait génial d'utiliser \multido directement, mais on peut aussi y renoncer.

Alex.

Code: Tout sélectionner
\documentclass{article}
\usepackage{animate}
\usepackage{pstricks-add}
\usepackage{fp}

\psset{algebraic,unit=2cm,linewidth=2pt}

\newcommand{\dessin}[1]{%
\begin{pspicture}(0,0)(1,1)
\psline(0,0)(0,1)(1,1)(1,0)(0,0)
\psplot[plotpoints=700]{0}{1}{x^(#1)}
\end{pspicture}}

\newcounter{count} %compteur
\setcounter{count}{0}

\FPset{\n}{1} %l'exponent qui sera un décimal
\xdef\nold{\n} %copie a portée globale

\begin{document}\centering

\begin{animateinline}[controls]{25}% `poster=first' est le défaut
  % La première frame
  \dessin{\n}%
  % Puis les autres frames
  \whiledo{\thecount<50}{
    \newframe%
    \FPadd{\n}{\nold}{0.5}% augmenter l'exponent
    \dessin{\n}%
    \xdef\nold{\n}% rafraîchir la copie, `\n' sera oublié
    \addtocounter{count}{1}% augmenter compteur
  }%
\end{animateinline}

\end{document}



qui correspond a la version utilisant \multido

Code: Tout sélectionner
% La première frame
\dessin{\n}%
% Puis les autres frames
\multido{\n=1.5+0.5}{50}{
  \dessin{\n}%
}%

MessagePosté: Mardi 17 Avril 2007, 17:17
par francois
Merci infiniment Alexander et bravo.
J'avoue que les commandes dans ton code son un peu obscures pour moi, mais ça marche impéccable ! Bravo pour ce package que je trouve extra et dont je suivrais les évolutions avec attention !

Francois

MessagePosté: Mardi 17 Avril 2007, 19:29
par francois
Simplement pour signaler que j'ai repris, ni plus ni moins, le code d'Alexander Grahn pour en faire la commande multiframe à insérer dans l'environnement \begin{animateinline} ... \end{animateinline}. Elle prend surtout comme argument un dessin dépendant d'un paramètre qui sera amener à varier avec le temps pour faire une succession d'images (ou frame pour la doc du package animate) qui formera l'animation :

\multiframe{nombre de frames}{nom du paramètre qui va varier}{valeur initiale du paramètre}{incrémentation du paramètre à chaque frame}{%
dessin qui dépend du paramètre}

Par exemple \multiframe{50}{\temps}{0}{0.5}{%
\Mondessin{\temps}}

Voici un exemple complet toujours avec les fonctions puissances :
Code: Tout sélectionner
\documentclass{article}
\usepackage[controls]{animate}
\usepackage{pstricks-add}
\usepackage{fp}

\psset{algebraic,unit=5cm,linewidth=2pt}

\newcommand{\Mondessin}[1]{
\begin{pspicture}(0,0)(1,1)
\psline(0,0)(0,1)(1,1)(1,0)(0,0)
\rput[l](0.1,0.9){frame numero \thecompteuranimate}
\psplot[plotpoints=700]{0}{1}{x^(#1)}
\end{pspicture}}


\newcounter{compteuranimate} % compteur spécial pour le package animate
\newcommand{\multiframe}[5]{%
   \setcounter{compteuranimate}{1}% mise à niveau de compteur
   \FPset{#2}{#3}% déclaration du paramètre temporel #2 et de la valeur initiale #3
   \xdef\oldparam{#2}% copie du paramètre à portée globale
   #5% première frame
   \whiledo{\thecompteuranimate<#1}{%
       \addtocounter{compteuranimate}{1}% augmenter le compteur
       \newframe%
       \FPadd{#2}{\oldparam}{#4}% incrémentation du paramètre
       #5% les autres frames
       \xdef\oldparam{#2}% rafraîchir la copie car le nom du paramètre #2 sera oublié
   }%
   \setcounter{compteuranimate}{1}% REmise à niveau de compteur pour les autres utilisations
}%

\begin{document}

Voici l'animation :

\begin{center}
\begin{animateinline}[loop]{25}
\multiframe{50}{\n}{1}{0.15}{%
\Mondessin{\n}}
\end{animateinline}
\end{center}

\end{document}


Merci encore à Alexander Grahn et bonne continuation pour cet excellent package.

MessagePosté: Jeudi 19 Avril 2007, 20:17
par stokastik
Trop bon vous m'avez fait découvrir animate là :D

Félicitations pour ce package!

MessagePosté: Vendredi 20 Avril 2007, 14:18
par francois
En effet, ce package va permettre des choses extraordinaires !

J'ai eu une petite correspondance par mail avec Alexander Grahn, la personne qui a fait ce package. Il est allemand et parle (écrit) très bien français. Je lui est soumis l'idée définir une commande qui permettrait de marquer une pause automatiquement au sein de l'animation, à un instant donné. Dès le lendemain, voila ti pas qu'il m'envoie très gentiment une nouvelle version du package avec une commande qui peut faire des pauses.

Autrement dit, il sera possible de faire des animations, avec des pauses pour mettre par exemple de belles légendes au fur et à mesure de l’animation. C'est carrément génial !

Pour l'instant cette nouvelle version contient des petits bugs. Quand ça sera résolu à peu près (pas par moi mais par Alexander Grahn, tout ça moi me dépasse complètement), je ferai un post explicatif de ce package sous MikTeX avec TeXnicCenter et avec un petit exemple à la clé.

Je suis professeur de math en lycée, et personnellement tout ça va beaucoup m'aider dans mon travail.

Sinon pour conclure le sujet initial de ce post :

CONCLUSION :
A ce jour (le 20/04/07) la commande \multido ne peut pas être insérée dans l'environnement \begin{animateinline} ... \end{animateinline}, mais comme l'a montré Alexander Grahn, on peut s'en passer en passant par la commande \whiledo et un simple petit compteur.


Petit bonus :
Je vous donne la commande que j'ai faite qui se contente simplement de condenser en une seule commande le code proposé par Alexander Grahn.
Attention, il faut charger le package fp (pour le calcul d'incrément) et ifthen (pour avoir la commande \whiledo), et tout ce qui est nécessaire à la conception d'un dessin sous PsTricks (par exemple pstricks-add).

Code: Tout sélectionner
% La commande \multiframeViVf marche comme ça :
% \multiframeViVf{nombre de frames}{nom du paramètre qui va varier}{%
%             valeur initiale (Vi) du paramètre}{valeur finale (Vf) du paramètre}{%
%             dessin qui dépend du paramètre}
%
% Par exemple
%     \begin{animateinline}{10}   %% Si on veut par exemple 10 images par seconde
%          \multiframeViVf{50}{\temps}{0}{20}{%
%          \Mondessin{\temps}}
%      \end{animateinline}


\newcounter{compteuranimate} % compteur spécial pour le package animate


%\multiframeViVf{#1}{#2}{#3}{#4}{#5}
\newcommand{\multiframeViVf}[5]{%
   \FPsub{\Difference}{#4}{#3}%                        %
   \FPsub{\Nbmoinsun}{#1}{1}%                          % Pour calculer l'incrément
   \FPdiv{\Increment}{\Difference}{\Nbmoinsun}%        %
   \xdef\oldIncrement{\Increment}% copie de Increment à portée globale sous le nom de \oldIncrement
   \setcounter{compteuranimate}{1}% mise à niveau de compteur
   \FPset{#2}{#3}% déclaration du paramètre temporel #2 prenant la valeur initiale #3
   \xdef\oldparam{#2}%
   %copie du paramètre à portée globale sous le nom de \oldparam
   #5% première frame
   \whiledo{\thecompteuranimate<#1}{%
       \addtocounter{compteuranimate}{1}% on augmente le compteur
       \newframe%
       \FPadd{#2}{\oldparam}{\oldIncrement}% on additionne l'incrément au paramètre
       #5% les autres frames
       \xdef\oldparam{#2}% rafraîchir la copie car le nom du paramètre #2 sera oublié
   }%
}%