PDA

View Full Version : Codice per simulare un moto parabolico


DesmoColo
03-02-2005, 14:28
Ciao!
Non so quanti di voi si ricordano il gioco del gorilla
Sto parlando di quel giochino (che per quanto ricordo era fatto in qbasic) in cui vi erano due gorilla messi ad una certa distanza, a turno ognuno lanciava contro l'altro una bana nel tentativo di colpire l'avversario.
Si potevano impostare i valori (velocità della banana e angolo di inclinazione rispetto alla verticale)

Sto facendo un'applicazione simile (al posto della banane ho una pallina :-)), ed avrei bisogno qualche suggerimento su come far lanciare un oggetto.
Di sicuro mi serve qualche formula fisica oppure uno pseudocodice che suggerisca di come simulare un corpo lanciato verso l'alto

Banus
03-02-2005, 14:44
Originariamente inviato da DesmoColo
Di sicuro mi serve qualche formula fisica oppure uno pseudocodice che suggerisca di come simulare un corpo lanciato verso l'alto
Direi che è sufficiente un sistema tempo-discreto che approssima la traettoria. Equazioni:

x=x0
y=y0
Vy = Vy0

x = x + Vx0*dt
Vy = Vy - g*dt
y = y + Vy*dt

x0, y0 è il punto di partenza dell'oggetto, Vx0, Vy0 la velocità iniziale rispettivamente sull'asse x e sull'asse y. g è l'accelerazione di gravità e dt è l'intervallo di tempo fra un fotogramma e l'altro, quindi deve essere molto piccolo (0.01 dovrebbe andare). Se prendi dt troppo grande la simulazione non è più corretta. Il seno di uguale (=) significa ovviamente assegnamento.

Per aggiungere anche il vento (come il gorilla.exe :D) basta modificare le equazioni:

x=x0
y=y0
Vx = Vx0
Vy = Vy0

Vx = Vx + Wx*dt
x = x + Vx*dt
Vy = Vy - g*dt + Wy*dt
y = y + Vy*dt

Le convenzioni per il segno della forza del vento (W) sono le stesse della velocità, cioè se hanno lo stesso segno il vento spinge l'oggetto. g e Wy nella terza equazione li puoi raccogliere per risparmiare calcoli, visto che sono fissi.
E se proprio vuoi esagerare, puoi inserire anche l'attrito dell'aria (h), dipendente dalla velocità:

Vx = Vx + Wx*dt - h*Vx*dt
x = x + Vx*dt
Vy = Vy - g*dt + Wy*dt - h*Vy*dt
y = y + Vy*dt

h deve essere abbastanza basso, altrimenti l'oggetto finisce subito a terra ;)
Sono andato a memoria, ma le equazioni dovrebbero essere quelle :p