Animation avec 2 cureurs liés

Aurélien Barbier-Accary shared this question 3 years ago
Answered

Bonjour,

J'ai une figure avec plusieurs intervalles caractérisés par un curseur "a" prenant des valeurs de 1 à 5. Au sein de chaque intervalle l'ensemble est paramétré par un curseur "u_a" dont les valeurs ne sont pas calculables à partir de "a" ; j'ai donc défini les bornes du curseur "u_a" par "Si(a ≟ 1, ..., a ≟ 2, ..., a ≟ 3, ..., a ≟ 4, ..., a ≟ 5, ...)".

Tout fonctionne très bien quand je fixe un "a" et que je fais bouger "u_a" à la main dans ce sous-intervalle.

Ce que j'aimerais maintenant c'est animer l'ensemble en partant de "a=1" avec les valeurs croissantes de "u_a", puis à la fin de cette première sous-animation de "u_a" passer automatiquement à "a=2" avec les nouvelles valeurs croissantes de "u_a", et ainsi de suite.

Autrement dit, lorsque le curseur "u_a" arrive à la valeur maximale j'aimerais passer à la valeur suivante de "a" et revenir à la nouvelle valeur minimale de "u_a", puis continuer / reprendre l'animation.

Y a-t-il une manière de faire cela ? Je n'ai rien trouvé dans les différentes questions-réponses existantes.

Merci par avance pour votre temps et votre aide.

Aurélien

Comments (12)

photo
1

Bonjour

Ce serait tellement plus "facile" pour nous si tu joignais ton fichier...

photo
1

A première vue, je ferais comme ça :

Tu crées 1 variable umax

umax = Si(a ≟ 1, ..., a ≟ 2, ..., a ≟ 3, ..., a ≟ 4, ..., a ≟ 5, ...) tu écris les valeurs max à la place des petits points

Puis dans le script par actualisation de u_a, tu écris :

SoitValeur ( a, Si u_a == umax, a+1,a)

Tu mets ton curseur a à 1, et tu animes le curseur u_a (croissant)


mais il faudrait essayer...

photo
1

Merci pour cette réponse rapide !

J'essaye et si besoin je mettrai mon fichier. Je n'ai pas le réflexe, c'est ma première demande sur le forum.

photo
1

Merci encore, j'arrive quasiment à faire ce que je souhaite, je rencontre juste encore un artefact lors des changements de "a" croissants car mes sous-intervalles de "u_a" sont croissants par partie mais chaque partie est inférieure à la précédente. Or quand je change de "a", "u_a" prend donc la valeur maximale de l'intervalle suivant au lieu de la valeur minimale... Je gère ça par script mais ce n'est pas encore pleinement satisfaisant, ça clignote lors de l'animation.


Voici en gros ce que j'ai pour le moment :

Booléen new_a = false


Curseur a :

min : 1

max : 5

incrément : a

script par actualisation :

SoitValeur(new_a, true)


Curseur u_a :

min : u_{a,min} qui est défini par Si(a ≟ 1, ..., a ≟ 2, ..., a ≟ 3, ..., a ≟ 4, ..., a ≟ 5, ...)

max : a + u_{a,max}u_{a,max} est défini par un autre Si(a ≟ 1, ..., a ≟ 2, ..., a ≟ 3, ..., a ≟ 4, ..., a ≟ 5, ...) ; la valeur maximale doit être augmentée d'un incrément (donc de a dans mon cas) pour qu'elle soit bien utilisée dans l'animation.

incrément : a

script par actualisation :

SoitValeur(u_a, Si(new_a==true, u_{a,min}, u_a))

SoitValeur(new_a, false)

SoitValeur(a, Si(u_a<u_{a,max}+a, a, Si(a<5, a+1, 1)))


Donc mon souci est que lorsque a est incrémenté, les bornes min et max de u_a changent automatiquement pour les valeurs du nouvel intervalle qui sont toutes strictement inférieures à celles de l'intervalle précédent ; donc u_a prend automatiquement la valeur maximale a + u_{a,max} avant que le script par actualisation ne se déclenche et remette bien la valeur initiale souhaitée, soit u_{a,min}.


Je ne suis pas sûr que tout ceci soit bien compréhensible sans exemple mais il faut que je fasse un fichier de test basique avec uniquement ces éléments pour vous le partager, sinon c'est trop complexe et ça ne sera pas beaucoup plus clair :-). Je vous partagerai ça d'ici la fin de la semaine, je voulais surtout vous faire savoir que votre réponse m'est très utile même si je n'avance pas bien vite.

photo
1

"Je ne suis pas sûr que tout ceci soit bien compréhensible sans exemple"

(envoie ton fichier "non fini" pour que ce soit compréhensible et qu'on trouve une "solution"...)

A première vue (encore) il faudrait peut être "actualiser" u_a dans le script par actualisation...

photo
1

J'ai fait un exemple qui se concentre sur le problème, il suffit d'appuyer sur le bouton "GO / STOP" pour observer les clignotements aux changements d'intervalle.

Autre problème lié : hors animation il est difficile de remettre à "a=1" sans enlever temporairement le script d'actualisation de "u_a"

photo
1

Pour supprimer tes "clignotements, j'ai "mis à jour" les 2 extrémités du segment dans le script d'actualisation de u_a

Je ne comprends pas pourquoi on ne peux pas bouger manuellement le curseur a :(

(j'ai mis un bouton de remise à zéro si ça peut servir...)

photo
photo
1

Bonjour,

Une approche différente, sans aucun scripts.

photo
1

Bonjour,


Merci, je n'avais pas du tout pensé à une telle approche ! J'ai adapté votre fichier (cf ci-joint) à un cas plus représentatif de mon besoin et ça fonctionne très bien, sans l'effet de "clignotement" que j'évoque dans ma réponse sur l'autre approche.


Cependant, bien que je trouve cette approche élégante, je la trouve également lourde et elle viendrait un peu "polluer" mon fichier pour un besoin technique.

Néanmoins merci encore, j'ai beaucoup appris sur GeoGebra en creusant votre proposition :-)

photo
1

Bonjour,

"polluer": Les (nombreux) points pourraient être stockés sous la forme d'une liste de points. En outre, tous les objets peuvent être cachés et marqués comme objets auxiliaires afin qu'ils n'apparaissent pas dans l'Algebra_View.

Une fonction composite serait plus compacte et techniquement plus attrayante

u_a(x) =Si(...,Si(....))

--------------------------------


En pièce jointe, ma solution première (avec script)

Notez les commentaires (#...) dans les scripts.

photo
1

Ah je ne connaissais pas les objets auxiliaires (ni les scripts que j'ai découverts par la réponse de jumera), jusque-là j'avais toujours eu un usage basique de GeoGebra.Merci pour tout ça, je vais creuser pour bien comprendre.

photo
1

Votre concept avec les 2 curseurs (u_a et a) est récursif. Un résultat cohérent ne peut jamais être atteint à 100,0% (même pas ma solution avec scripts). De plus, le fonctionnement du GGB dépend de l'environnement (performance, memory, etc. le résultat est donc difficilement reproductible)

Une autre approche de solution, qui se réfère à votre dernier exemple (test-animation.ggb), se trouve en annexe. Cette solution n'utilise pas non plus de scripts et n'est pas récursive.

Ici, un point se déplace sur une liste avec des segments. La position actuelle du point est donnée par un ParamètreChemin (Intervalle de valeurs toujours 0..1). Le concept de ParamètreChemin est un élément très important du GGB auquel vous devriez vous habituer tôt ou tard (links).

photo
© 2023 International GeoGebra Institute