walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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...
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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...
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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. |
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
Postato originariamente da Il Totem:
Codice sorgente - presumibilmente VB.NET |
'a > accelerazione, di tipo Point 'v > velocità, di tipo Point 'p > posizione, di tipo point 'non è definito l'operatore * tra point e double, ma assumiamo 'per semplicità che esista v += a * Timer1.Interval / 1000 p += v * Timer1.Interval / 1000 p.X = p.X Mod sfondo.Width If p.X < 0 Then p.X = sfondo.Width - p.X End If If p.y > sfondo.Height Then Timer1.Stop() p.y = sfondo.Height 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) |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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 è? |
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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...
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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é).
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
il codice è ancora quello o cambiato solo la formula...
Codice sorgente - presumibilmente C# / VB.NET |
'handles timer1.tick interval=1
i += 0.15
If i = 0.15 Then
attrad = Math.Atan((vely / velx))
att = attrad / Math.PI * 180
dist += ((vel ^ 2 * Math.Sin(2 * angr)) / g.Text)
dimax.Text = dist
altmax = Math.Abs((((vel ^ 2) * Math.Sin(angr) * Math.Cos(angr)) / g.Text) / 2)
almax.Text = altmax
temp += (2 * vel * Math.Sin(angr)) / g.Text
tem.Text = temp
start = proiettile.Left
End If
proiettile.Top = proiettile.Top - vely * i + (1 / 2 * g.Text * i ^ 2)
If proiettile.Top < massimo Then
massimo = proiettile.Top
End If
If proiettile.Top + proiettile.Height >= sfondo.Top Then
i = 0
Timer1.Enabled = False
proiettile.Top = sfondo.Top - proiettile.Height
vai.Enabled = True
Button1.Enabled = True
Button2.Enabled = True
End If
proiettile.Left = proiettile.Left + velx * i
If proiettile.Left > sfondo.Width Then
Threading.Thread.Sleep(100)
proiettile.Left = 0
ind.Left = 0
Threading.Thread.Sleep(100)
ElseIf proiettile.Left < 0 Then
Threading.Thread.Sleep(100)
proiettile.Left = sfondo.Width - proiettile.Width
ind.Left = proiettile.Left
Threading.Thread.Sleep(100)
End If
ind.Left = proiettile.Left
If proiettile.Top < PictureBox1.Top Then
ind.Visible = True
proiettile.Visible = False
Else
ind.Visible = False
proiettile.Visible = True
End If
|
Ultima modifica effettuata da walker93 il 16/06/2010 alle 22:39 |
|