Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - moto proiettile: distanza
Forum - C# / VB.NET - moto proiettile: distanza - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 18:05
Mercoledì, 09/06/2010
ci sono riuscito...
sbagliavo approccio...
le formule che usavo andavano bene, ma facevo il calcolo della distanza ogni volta che succedeva qualcosa, come il superamento del bordo.
ci ho pensato è ho capito che ad ogni tick del timer avrei dovuto calcolare la distanza cosi mi è bastato sommare ad ogni tick la nuova posizione del proiettile meno quella vecchia per ottenere la distanza percorsa in quell'istante di tempo...

grazie a tutti comunque...

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:29
Giovedì, 10/06/2010
adesso il problema è ahimè un altro...

adesso devo rappresentare graficamente la giusta distanza...
cioè se sparo a 10 m/s  a 45° mi muovo di 10m
ma io di quanti pixel devo spostare il proiettile effettivamente per far sembrare reale lo spostamento??
io do anche la possibilità di modificare il punto di partenza: se metto 10 m sull'asse x
anziche zero mi si sposta di un tot (100 px adesso faccio 10*10m)
ma se come prima sparo a 10 m/s a 45° e mi muovo di 10 m
la posizione finale del proiettile sarà diversa da aver compiuto lo spostamento inserendo 10 m nello spazio per modificare la distanza iniziale

visto che i pixel sono un unità dimisura relativa,non c'è una formula che converte metri in pixel, non so come fare...

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:30
Sabato, 12/06/2010
Testo quotato

Postato originariamente da walker93:

scusami ma proprio non mi è chiaro...
come fanno accelerazione e velocità a essere di tipo point???
e se i valori di a e di timer1.interval non cambiano:
v viene incrementata sempre dello stesso valore...(Es.  2 poi 4,6,8,10,12,14,16)
la velocità non dovrebbe incrementare...



In assenza del tipo vettore, è possibile usare un Point per memorizzare le due componenti di velocità e accelerazione (perchè queste, ovviamente, in un problema a due dimensioni, sono vettori). E, se non sbaglio, la costante di accelerazione gravitazionale è, in un intorno ristretto della superficie terrestre, approssimativamente costante; perciò non c'è motivo di sorprendersi del fatto che la velocità sia aumentata di un fattore costante.
Se pensi alla definizione di accelerazione (istantanea):
a = dv / dt
E ricavi dv, quindi integri fra due estremi dati, ricavi:
DV = a * Dt (D = delta)
E hai che la variazione di velocità è proporzionale all'accelerazione e al periodo di tempo considerato (Timer1.Interval).


Lo spostamento orizzontale dovresti già averlo se hai usato formule simili a quelle che ti ho mostrato, in quando p.X, alla fine, contiene lo spostamento finale sulle ascisse.

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 17:24
Lunedì, 14/06/2010
Testo quotato

Postato originariamente da Il Totem:

Codice sorgente - presumibilmente VB.NET

  1. 'a > accelerazione, di tipo Point
  2. 'v > velocità, di tipo Point
  3. 'p > posizione, di tipo point
  4.  
  5. 'non è definito l'operatore * tra point e double, ma assumiamo
  6. 'per semplicità che esista
  7. v += a * Timer1.Interval / 1000
  8. p += v * Timer1.Interval / 1000
  9.  
  10. p.X = p.X Mod sfondo.Width
  11. If p.X < 0 Then
  12.    p.X = sfondo.Width - p.X
  13. End If
  14.  
  15. If p.y > sfondo.Height Then
  16.    Timer1.Stop()
  17.    p.y = sfondo.Height
  18. End If





adesso questo mi è chiaro ...

ma non riesco comunque a visualizzare correttamente il giusto spostamento quando inserisco una posizione diversa dallo 0.
come ho già detto se mi sposto di 10 m simulando lo sparo(partendo da 0) la posizione finale del proiettile è diversa dalla posizione che ottengo spostandomi di 0 m (partendo da 10 m)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:40
Martedì, 15/06/2010
Testo quotato

Postato originariamente da walker93:
ma non riesco comunque a visualizzare correttamente il giusto spostamento quando inserisco una posizione diversa dallo 0.
come ho già detto se mi sposto di 10 m simulando lo sparo(partendo da 0) la posizione finale del proiettile è diversa dalla posizione che ottengo spostandomi di 0 m (partendo da 10 m)



Quindi 10+0=/=0+10 ? Pensavo che l'addizione godesse della proprietà commutativa.
Il nuovo codice qual è?

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 15:50
Martedì, 15/06/2010
non è esattamente 0+10=/=10+0

nel primo caso SIMULO lo spostamento con il codice nel timer e mi sposto di 10m (secondo una formula di wikipedia)e ad esempio di 200px (200px è inventato)

nel secondo NON faccio la simulazione ma CAMBIO la mia posizione iniziale tramite textbox inserendo 10m ma non mi si sposta di 200 px come invece dovrebbe essere...

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:58
Mercoledì, 16/06/2010
Ho capito quello che succede, ma se continui a dirmelo a parole io non so fare altro che dirti che hai sbagliato qualcosa. Finché non vedo il nuovo codice, non posso indicarti dove hai sbagliato. Al massimo posso dirti che la tua formula non è abbastanza generale, dato che il primo è un caso particolare del secondo (quindi dovresti impegnarti a far funzionare il secondo caso, cosicché il primo si risolva da sé).

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:35
Mercoledì, 16/06/2010
il codice è ancora quello o cambiato solo la formula...

Codice sorgente - presumibilmente C# / VB.NET

  1. 'handles timer1.tick interval=1
  2.         i += 0.15
  3.         If i = 0.15 Then
  4.             attrad = Math.Atan((vely / velx))
  5.             att = attrad / Math.PI * 180
  6.             dist += ((vel ^ 2 * Math.Sin(2 * angr)) / g.Text)
  7.             dimax.Text = dist
  8.             altmax = Math.Abs((((vel ^ 2) * Math.Sin(angr) * Math.Cos(angr)) / g.Text) / 2)
  9.             almax.Text = altmax
  10.             temp += (2 * vel * Math.Sin(angr)) / g.Text
  11.             tem.Text = temp
  12.             start = proiettile.Left
  13.         End If
  14.  
  15.         proiettile.Top = proiettile.Top - vely * i + (1 / 2 * g.Text * i ^ 2)
  16.         If proiettile.Top < massimo Then
  17.             massimo = proiettile.Top
  18.         End If
  19.         If proiettile.Top + proiettile.Height >= sfondo.Top Then
  20.             i = 0
  21.             Timer1.Enabled = False
  22.             proiettile.Top = sfondo.Top - proiettile.Height
  23.             vai.Enabled = True
  24.             Button1.Enabled = True
  25.             Button2.Enabled = True
  26.         End If
  27.         proiettile.Left = proiettile.Left + velx * i
  28.         If proiettile.Left > sfondo.Width Then
  29.             Threading.Thread.Sleep(100)
  30.             proiettile.Left = 0
  31.             ind.Left = 0
  32.             Threading.Thread.Sleep(100)
  33.         ElseIf proiettile.Left < 0 Then
  34.             Threading.Thread.Sleep(100)
  35.             proiettile.Left = sfondo.Width - proiettile.Width
  36.             ind.Left = proiettile.Left
  37.             Threading.Thread.Sleep(100)
  38.         End If
  39.         ind.Left = proiettile.Left
  40.         If proiettile.Top < PictureBox1.Top Then
  41.             ind.Visible = True
  42.             proiettile.Visible = False
  43.         Else
  44.             ind.Visible = False
  45.             proiettile.Visible = True
  46.         End If


le formule sono tratte da wikipedia:
http://it.wikipedia.org/wiki/Moto_parabolico

Ultima modifica effettuata da walker93 il 16/06/2010 alle 22:39
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo