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

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

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

Messagepar francois » Lundi 16 Avril 2007, 01:17

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.
Dernière édition par francois le Samedi 21 Avril 2007, 15:33, édité 4 fois.
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant

Publicité

Messagepar francois » Lundi 16 Avril 2007, 18:54

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.
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant

Messagepar rebouxo » Lundi 16 Avril 2007, 21:43

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
rebouxo
Modérateur
 
Messages: 6909
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Messagepar gigiair » Lundi 16 Avril 2007, 21:50

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.
JJR.
LaTeXien migrateur.
gigiair
Exa-utilisateur
 
Messages: 2395
Inscription: Samedi 08 Juillet 2006, 19:56
Localisation: Saint Bonnet Elvert
Statut actuel: Actif et salarié

Messagepar francois » Mardi 17 Avril 2007, 00:30

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:
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant

Messagepar a.grahn » Mardi 17 Avril 2007, 07:59

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
a.grahn
Hecto-utilisateur
 
Messages: 63
Inscription: Mercredi 11 Avril 2007, 12:38

Messagepar a.grahn » Mardi 17 Avril 2007, 13:37

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}%
}%
Dernière édition par a.grahn le Mercredi 18 Avril 2007, 10:46, édité 2 fois.
a.grahn
Hecto-utilisateur
 
Messages: 63
Inscription: Mercredi 11 Avril 2007, 12:38

Messagepar francois » Mardi 17 Avril 2007, 17:17

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
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant

Messagepar francois » Mardi 17 Avril 2007, 19:29

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.
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant

Messagepar stokastik » Jeudi 19 Avril 2007, 20:17

Trop bon vous m'avez fait découvrir animate là :D

Félicitations pour ce package!
stokastik
 

Messagepar francois » Vendredi 20 Avril 2007, 14:18

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é
   }%
}%
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Bing [Bot] et 15 invités