SIMULANCE, UN SIMULATEUR DE LANCÉ D'OBJETS

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 19 déc. 2007 à 20:28
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 - 21 déc. 2010 à 18:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45131-simulance-un-simulateur-de-lance-d-objets

ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
21 déc. 2010 à 18:29
Bonjour,

Il est vrai que l'utilisation de la formule "Py(t) = Py(0) + Vy(0)*t + 1/2*g*t" pour calculer la vitesse en y est bien plus judicieuse que le recours à l'énergie cinétique.

Je ne l'avais pas encore vue lors de l'implémentation de ce programme mais c'est vrai que c'est une méthode beaucoup plus juste, efficace et rapide que celle implémentée dans le programme (la preuve, les différences entre les deux courbes obtenues si l'on implémente l'une ou l'autre des méthode).

A bientôt...
Mal_au_DOS Messages postés 39 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 28 octobre 2008
17 janv. 2008 à 19:16
Je pense serieusement que ma formule est bonne.

Prenons la formule py(t)=py(0)+t*vy(0)+gt^2*t^2
Lorsque t augmente, py(0) est constant, t*vy(0) augmente(puisque vy(0)>0) et gt^2*t^2 augmente aussi, donc vy(t) ne fait qu'augmenter, ce qui veut dire que le solide ne vas pas décrire de cloche mais va s'élever dans les airs.

Après si vous n'êtes pas convaincus il faut intégrer deux fois l'accélération qui n'est autre que la dérivée seconde de la position, afin d'obtenir cette expression; voir les cours de terminale S sur les équations horaires.

dans ton cas, il te suffit de faire une fonction Y(float x, float V){return Y0+V*x-0.5*g*x² ;} voilà

ensuite tu fait ta boucle normal et tu affiche à chaque fois le solide aux coordonnées (X, Y(X)).
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
17 janv. 2008 à 17:33
Bonjour ACX01B et MAL_AU_DOS,
laquelle de ces deux expressions est vraie (est à utiliser)?

py(t) = py(0) + t.vy(0) + g.t^2/2
ou
Py(t) = Py(0) + Vy(0)*t - 0.5g*t^2

la seule différence est un -.

Merci d'avance...
A bientôt...
Mal_au_DOS Messages postés 39 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 28 octobre 2008
29 déc. 2007 à 00:00
heu en réalité je crois plutôt que la formule c'est:

Py(t) = Py(0) + Vy(0)*t - 0.5g*t^2

en effet selon la formule de ACX01B le pauvre solide ne redescendrait pas puisque quand t augmente la position de Py(t) ne peut qu'augmenter.

Joli prog A++
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
21 déc. 2007 à 19:47
salut j'ai l'impression que tu n'as pas vu la formule

py(t) = py(0) + t.vy(0) + g.t^2/2
py(t) c'est le position en y de l'objet à l'instant t

oui ton programme est faut car tu n'as pas utilisé cette formule (qui est la seule qui soit bonne) mais puisque ton pas de discrétisation est petit ça ne se voit pas

après il faut gérer le rebond là ça se complique hé oui
tu l'auras deviné ils faut résoudre l'équation py(x) = 0
et changer le signe de vy(x) ainsi qu'appliquer une petit coefficient de restitution (inférieur à 1)
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
21 déc. 2007 à 18:10
Finalement j'aurai besoin:
d'une unique boucle qui s'occupera de la montée et de la descente
ou bien de 2 (une pour montée, une autre pour descente)?

Désolé pour ces questions mais je n'ai pas encore vu expression en cours (enfin une expression comparable)...
Si par contre vous connaissez des sites internet qui expliquent ou même parlent cette technique, celà pourrait m'intérresser car il semble que cette solution soit beaucoup plus pratique que l'autre...
A bientôt...
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
21 déc. 2007 à 17:58
Non t c'est le temps écoulé en secondes
p(0) la position initiale de l'objet
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
21 déc. 2007 à 17:46
Y aura-t'il toujours besoin de trouver zb?
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
21 déc. 2007 à 17:45
Salut axc01b,
si je comprends bien ta réponse:
la vitesse en t est proportionnelle à t la hauteur en metre de la nouvelle position (et constante?)?
est-ce bien celà?
Cette technique me permettrait-elle de trouver les positions en dessous de la position y du lancer?

Question pour les unitées et valeurs:
v(t) = v(0) + g.t
v(t) est la vitesse en t en m.s-1
v(0) la vitesse à la position initiale en m.s-1
g = 9,81
et t la hauteur en m de l'objet par rapport à 0 ou par rapport au départ du lancer?

Sinon, en soit le programme actuel est-il faut?
Il est vrai que si votre technique fonctionne, il y aura beaucoup moins de calculs à faire, donc moins de pertes de temps et un programme avec une simulation plus rapide...

A bientôt...
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
20 déc. 2007 à 23:59
c'est de la deuxième loi de newton:
dv / dt = a
c'est à dire que la dérivée de la vitesse : v'(t) c'est l'accélération a(t)
a(t) = f(t)/m
la force sur la masse
comme toi tu n'appliques que une force verticale la gravité
et qu'elle vaut m.g
alors a(t) = g
et v(t) = v(0) + intégrale de 0 à t de a(t)
puisque par définition a(t) c'est la dérivée de la vitesse
miracle l'accélération est constante donc
v(t) = v(0) + g.t
et donc la position
p(t) p(0) + intégrale de 0 à t de v(t)
p(0) + t.v(0) + intégrale de 0 à t de g.t
= p(0) + t.v(0) + g.t^2/2
(quand tu dérives g.t^2/2 ça fait bien g.t)

a+
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 déc. 2007 à 22:01
Ta fonction DoubleToChar retourne un pointeur sur la zone memoire allouée, ta juste a faire un free dessus..
Sinon tu peux passer un pointeur en parametre de facon a allouer et liberer la memoire en dehors de la fonction, comme ca pas besoin d'alloué et de liberer de la memoire a chaque MOUSEMOVE..

Neo_Fr
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
20 déc. 2007 à 21:40
Salut Neo_Fr,
comment libérer la mémoire allouée par DoubleToChar (j'ai essayer free... peu être pas au bon endroit)?
Je vous remercie d'avance...
A bientôt...
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
20 déc. 2007 à 14:38
Salut,

Neo_Fr: pour la fonction DoubleToChar, je vais essayer de voir pour libérer la mémoire car celà peut s'avérer génant voire très génant.

Sinon pour ce que dit acx01b, que je remercie pour la note,
Il faut que je regarde pour:
Vx(t) = Vx(0)
Vy(t) = Vy(0) + g*t
Px(t) = Px(0) + Vx(0)*t
Py(t) = Py(0) + Vy(0)*t + 1/2*g*t
mais il est fort probable que je me sois compliqué la vie ;)

Brève explication du fonctionnement du simulateur:
1 - je calcule la vitesse en y de l'objet
2 - j'ajoute 1/1000 de cette vitesse (soit le déplacement pour une milliseconde) à la position y de l'objet
3 - Puis c'est reparti pour un tour, et celà tant que l'objet n'est pas à sa position maximale ou minimale fixée à zéro. Le programme arrête cette boucle si l'objet est sorti de l'écran
Actuellement, je ne sais pas comment faire autrement, il est vrai que cette méthode ne fournit qu'une estimation des positions mais pour l'instant çà à l'air de bien fonctionner.
Pour information: La vitesse x est constante donc aucuns problèmes quant au déplacement de l'objet suivant x.

Merci pour ces commentaires...
Et à bientôt...
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
20 déc. 2007 à 13:19
salut

j'ai l'impression sans en être sur que tu t'es compliqué sur la position et la vitesse de l'objet en fonction du temps:
Vx(t) = Vx(0)
Vy(t) = Vy(0) + g*t
Px(t) = Px(0) + Vx(0)*t
Py(t) = Py(0) + Vy(0)*t + 1/2*g*t
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
19 déc. 2007 à 20:28
Ta fonction DoubleToChar alloue de la memoire, memoire que tu ne libere pas..

Neo_Fr