[Maths / physique] Une bonne colle sur les mouvements

Bonjour à tous.
Je suis actuellement en train de développer un moteur d’animation javascript (pour créer des joulies applications WEB qui bougent dans tous les sens ^^), et je bloque sur un problème de math.
Pour l’instant j’arrive à animer des valeurs numérique de façon linéaire sans problème (par exemple pour déplacer une DIV flottante avec une vitesse régulière).

Ma deuxième étape est un peu plus complexe : il s’agit de pouvoir spécifier un temps d’accélération en début et de décélération en fin de mouvement. L’accélération et la décélération sont linéaire avec une vitesse partant de 0 pour l’accélération et arrivant à 0 pour la décélération

Voilà les données que j’ai :
Tb : Date de début de mouvement
Te : Date de fin du mouvement
D : Distance totale à parcourir
Ta : Durée de la période d’accélération
Td : Durée de la période de décélération

A partir de là, il me faut savoir à tout moment la distance parcourue… Et la je bloque. Invocation de star de la physique ! (ou de gens qui ont accès aux sources du moteur d’animation de Windows Presentation Foundation par exemple ! :P)

accélération = dérivée de la vitesse par rapport au temps.
vitesse = dérivée de la position par rapport au temps.
donc position = intégrale double de la vitesse par rapport au temps.
accélération a1 cste, vitesse initiale v1, position initiale p1.

donc p(t) = a1t²/2 + v1t + p1.
décélération = accélération négative.
normalement, t’as tout (si je m’est pas gouré)

J’avais déja eu ce problème…

Tu ne peux pas le réduire à une seule formule tout simplement parce que ta fonction d’accélération est discontinue. en gros, tu as deux formules différentes si tu es dans la phase d’accélération ou dans la phase de décélération.
2sec… c’est loin tout ça…

[quote=« gring, post:3, topic: 29527 »]J’avais déja eu ce problème…

Tu ne peux pas le réduire à une seule formule tout simplement parce que ta fonction d’accélération est discontinue. en gros, tu as deux formules différentes si tu es dans la phase d’accélération ou dans la phase de décélération.
2sec… c’est loin tout ça…[/quote]

Molyss > J’étais arrivé à peu près au même point que toi, mais mon problème est d’avoir la valeur de l’accélération en fonction de mes autres données… Mon gros problème en fait est de trouvé soit a, soit Vmax.

Le premier qui trouve… bah… c’est le premier qui trouve quoi ! :stuck_out_tongue:

Mais c’est toi qui fixe l’acceleration non ?

Vmax dépend de Ta+Td…

Début du raisonnement:

Aa: accélération
Ad: décélération

-Ta fonction d’accélération en fonction tu temps, c’est un segment qui vaut Aa le temps de l’accélération, et Ad pendant la décélération (Ad étant négatif).

Maintenant, si tu intègres cette fonction, tu auras la vitesse en fonction du temps, qui ressemble à un triangle (ça monte jusqu’à Vmax, puis ça redescend).

Si tu considères que tu pars d’une vitesse nulle et que tu arrives à une vitesse nulle, ça veut dire que:

AaTa = -AdTd

si tu intègres chacun des membres pour avoir les vitesses, tu as:

accélération: V(t) = Aat + V0
décélération: V(t) = Ad
t + Vmax

(t l’indice de temps dans chacune des phases, pour simplifier)

Or, à la fin de la décélération, la vitesse est nulle, on a donc Ad*Td + Vmax = 0

pareil pour l’accélération: Aa*Ta = Vmax (en considérant V0 nulle)

Ok, si T est la période au milieu sans accélération alors :

1/2 AaTa^2 + VmaxT + 1/2 (-Ad)*Td^2 = D

et

AaTa = -AdTd = Vmax

Donc

1/2 VmaxTa + VmaxT + 1/2 Vmax*Td = D

Ce qui donne Vmax = D/(T+(Ta+Td)/2)

T = (Te-Tb) - Ta - Td

D’où Vmax = D/(Te-Tb - (Ta+Td)/2)

Edit: Heu… c’est quoi “a” ?

Bon, on dit qu’on est au bac.

Le truc, c’est de ne pas s’embrouiller les pinceaux, il y a beaucoup de variables qui dépendent d’autres, il faut donc choisir celles que l’on veut fixer en fonction de celles que l’on veut trouver.

Partons du cas général:

td: date du départ
tt: date de la transition accélération/décélération
tf: date d’arrivée

ad: accélération
af: décélération

vd: vitesse initiale (on prend le cas le plus large)
vt: vitesse au moment de la transition (vitesse maximale)
vf: vitesse finale

xi: position initiale
xt: position au moment de la transition
xf: position finale

il y a des variables qui dépendent d’autres, par exemple, la vitesse maximale dépend de la distance parcourue (xf-xi), du temps de déplacement, du dosage accélération/décélération et des vitesses initiales/finales…

On a deux périodes distinctes, la phase d’accélération ( td < t < tt), et la phase de décélération (tt < t <tf)

pendant ces deux périodes:
a(t) = ad
a(t) = af (avec af < 0)

par intégration, on obtient:

v(t) = adt + C1
v(t) = af
t + C2

C1 = vd - adtd
C2 = vf - af
tf

=>
v(t) = adt + vd - adtd
v(t) = aft + vf - aftf

par intégration, on obtient:

x(t) = adt²/2 + t(vd - adtd) + C3
x(t) = af
t²/2 + t*(vf - af*tf) + C4

C3 = xd - adtd²/2 - td(vd - adtd) = adtd²/2 -vdtd + xd
C4 = af
tf²/2 -vf*tf + xf

x(t) = adt²/2 + t(vd - adtd) + adtd²/2 -vdtd + xd
x(t) = af
t²/2 + t*(vf - aftf) + aftf²/2 -vf*tf + xf

Dans cette solution, on a des variables inter-dépendantes, il faut donc faire les remplacements qui vont bien
dans notre cas de programmeux, ce que l’on cherche à définir, c’est:

xf et xd les points de départ et d’arrivée
vd et vf les vitesses de départ et d’arrivée on peut simplifier en les considérant nulles, mais vu qu’on est là, hein…
td, tt et tf

Les inconnues sont donc ad et af… pour les trouver, il suffit de regarder vt:
vt = adtt + vd - adtd = aftt + vf - aftf

Il nous faut une seconde équation, on n’a qu’a prendre la position au moment de la transition:
xt = adtt²/2 + tt(vd - adtd) + adtd²/2 -vdtd + xd = aftt²/2 + tt*(vf - aftf) + aftf²/2 -vf*tf + xf

et là on a un magnifique système de deux équations à deux inconnues, à partir de ça, on détermine les accélérations en fonction des autres variables, on remplace dans les equations de x(t), et c’est gagné…

[quote=“gring, post:8, topic: 29527”]Bon, on dit qu’on est au bac.

Le truc, c’est de ne pas s’embrouiller les pinceaux, il y a beaucoup de variables qui dépendent d’autres, il faut donc choisir celles que l’on veut fixer en fonction de celles que l’on veut trouver.

Partons du cas général:

td: date du départ
tt: date de la transition accélération/décélération
tf: date d’arrivée

ad: accélération
af: décélération

vd: vitesse initiale (on prend le cas le plus large)
vt: vitesse au moment de la transition (vitesse maximale)
vf: vitesse finale

xi: position initiale
xt: position au moment de la transition
xf: position finale

il y a des variables qui dépendent d’autres, par exemple, la vitesse maximale dépend de la distance parcourue (xf-xi), du temps de déplacement, du dosage accélération/décélération et des vitesses initiales/finales…

On a deux périodes distinctes, la phase d’accélération ( td < t < tt), et la phase de décélération (tt < t <tf)

pendant ces deux périodes:
a(t) = ad
a(t) = af (avec af < 0)

par intégration, on obtient:

v(t) = adt + C1
v(t) = af
t + C2

C1 = vd - adtd
C2 = vf - af
tf

=>
v(t) = adt + vd - adtd
v(t) = aft + vf - aftf

par intégration, on obtient:

x(t) = adt²/2 + t(vd - adtd) + C3
x(t) = af
t²/2 + t*(vf - af*tf) + C4

C3 = xd - adtd²/2 - td(vd - adtd) = adtd²/2 -vdtd + xd
C4 = af
tf²/2 -vf*tf + xf

x(t) = adt²/2 + t(vd - adtd) + adtd²/2 -vdtd + xd
x(t) = af
t²/2 + t*(vf - aftf) + aftf²/2 -vf*tf + xf

Dans cette solution, on a des variables inter-dépendantes, il faut donc faire les remplacements qui vont bien
dans notre cas de programmeux, ce que l’on cherche à définir, c’est:

xf et xd les points de départ et d’arrivée
vd et vf les vitesses de départ et d’arrivée on peut simplifier en les considérant nulles, mais vu qu’on est là, hein…
td, tt et tf

Les inconnues sont donc ad et af… pour les trouver, il suffit de regarder vt:
vt = adtt + vd - adtd = aftt + vf - aftf

Il nous faut une seconde équation, on n’a qu’a prendre la position au moment de la transition:
xt = adtt²/2 + tt(vd - adtd) + adtd²/2 -vdtd + xd = aftt²/2 + tt*(vf - aftf) + aftf²/2 -vf*tf + xf

et là on a un magnifique système de deux équations à deux inconnues, à partir de ça, on détermine les accélérations en fonction des autres variables, on remplace dans les equations de x(t), et c’est gagné…[/quote]

J’ai pas tout lu, mais il te manque la phase “stable” entre les phases d’accélération et de ralenti :
J’ai une phase qui monte jusqu’a la vitesse maximum, puis une phase stable, et la phase de décélération.
Je ne connais ni la valeur de l’accélération, ni la vitesse maximal à atteindre (je dois les déduire de la distance à atteindre ainsi qu’aux autres données). C’est là le point complexe du problème ^^.

[quote]Voilà les données que j’ai :
Tb : Date de début de mouvement
Te : Date de fin du mouvement
D : Distance totale à parcourir
Ta : Durée de la période d’accélération
Td : Durée de la période de décélération[/quote]

Petite précision : (Te-Tb) >= (Ta+Td)

Autre précison : je sais que c’est possible, j’ai calqué mon problème sur le modèle des DoubleAnimation de WPF…

Au pasage je m’aperçois qu’il faut que je reprenne les maths… Si tu trouves la solution, essais de me dégager une fonction f(x) qui contient une solution magique à mon problème ^^

Prend reflector et matte le code de WPF sinon :stuck_out_tongue:

J’y ai pensé… j’ai eu la flemme… mais j’y repense ^^

[quote=« girafologue, post:9, topic: 29527 »]J’ai pas tout lu, mais il te manque la phase « stable » entre les phases d’accélération et de ralenti :
J’ai une phase qui monte jusqu’a la vitesse maximum, puis une phase stable, et la phase de décélération.
Je ne connais ni la valeur de l’accélération, ni la vitesse maximal à atteindre (je dois les déduire de la distance à atteindre ainsi qu’aux autres données). C’est là le point complexe du problème ^^.[/quote]

Non, je crois qu’il y a bien une phase sans accélération dans son calcul. Sinon elle te plait pas ma formule ? :stuck_out_tongue:

Vitesse maximale
Vmax = D/(Te-Tb - (Ta+Td)/2)

Accélération
Aa = Vmax/Ta

Décélération
Ad = -Vmax/Td

Distance parcourue en fonction du temps :

  • entre Tb et Tb+Ta
    d(t) = 1/2 Aa*(t-Tb)^2

  • entre Tb+Ta et Te-Td
    d(t) = 1/2 AaTa^2 + Vmax(t - (Tb+Ta))

-entre Te-Td et Te
d(t) = 1/2 AaTa^2 + Vmax(t - (Tb+Ta)) + 1/2 Ad*(t-(Te-Td))^2

je n’avais pas pris en compte une phase de vitesse constante dans le calcul…
ça ne change pas grand chose…

Je vais trouver.

On récapitule:

On a 3 phases (accélération, stable, décélération)
On les délimite par 4 points: a,b,c,d

Ta, Tb, Tc, Td : les dates aux limites entre les phases
Aa, Ab, Ac, Ad: Les accélérations à ces limites (Ab = Ac = 0)
Va, Vb, Vc, Vd: Les vitesses (Vb = Vc)
Xa, Xb, Xc, Xd: Les positions

On écrit les fonctions en fonction des phases sous cette forme: Aa->b(t)

Si on reprend le calcul d’hier, on se retrouve avec:

Aa->b(t) = Aa (phase d’accélération)
Ab->c(t) = 0 (phase stable)
Ac->d(t) = Ad (phase de décélération)

Va->b(t) = Aat + Va - AaTa
Vb->c(t) = Vb (Vitesse maximum)
Vc->d(t) = Adt + Vd -AdTd

Xa->b(t) = t²Aa/2 + t(Va-AaTa) + Ta²Aa/2 - VaTa + Xa
Xb->c(t) = Vb
t + Xb - VbTb
Xc->d(t) = t²
Ad/2 + t*(Vd-AdTd) + Td²Ad/2 - Vd*Td + Xd

Maintenant, il faut déterminer les inconnues Aa et Ad (on en déduira les termes de Xb->c)
En écrivant que Va->b(Tb) = Vb = Vc->d(Tc), ou en intégrant les fonctions accélération, on obtient:

(Td - Tc)Ad + (Tb - Ta)Aa = Vd - Va

Il nous faut une seconde équation… S’il reste quelqu’un de réveillé, je veux bien une idée.

Au passage:

Vb = (Xc - Xb) / (Tc - Tb)

Désolé, je n’avais pas vu ce thread, j’espère qu’il n’est pas trop tard. Voilà ma solution. Je n’ai pas cité les équations du mouvement rectiligne uniformément accéléré, tu sembles les connaître. Le reste, c’est du calcul, j’espère ne pas avoir commis de bourde. J’ai juste changé une ou deux notations en ajoutant des delta pour bien faire la différence entre des instants et des durées, je suis resté à ta notation pour le reste.

Bien sûr, si quelqu’un trouve une erreur, n’hésitez pas à corriger. Je mets ma source LaTeX au cas où, j’ai fait ça vite fait alors ne faites pas attention au header plein de trucs inutiles, j’avais la flemme de le nettoyer.

Bon merci à tous, mon problème est réglé, je vais optimiser un peu tous mes calculs, et fignoler un peu tout ca, et je vous posterai une petite démo…

Merci en tout cas et à bientôt pour de nouvelles aventures !

Re-bonjour à tous.
Voilà le bout de moteur qui fonctionne : sur mon blog
Tout commentaire est le bienvenu