Oppure

Loading
04/06/10 16:14
walker93
sto facendo un programma che simula il moto di un proiettile...
tutto ok, funziona tutto bene tranne la distanza raggiunta dal proiettile
il proiettile è un immagine in una picture box

quindi finche il proiettile non esce dal bordo della finestra la distanza è uguale alla posizione finale meno quella iniziale.

il problema c'è quando supera il bordo (in questo caso torna al bordo di partenza) solo che non so come calcolare la distanza in questo modo...

ho provato alcune formule senza successo...

allego un immagine col problema
Ultima modifica effettuata da walker93 04/06/10 16:16
aaa
04/06/10 16:21
Il Totem
Semplicemente, sposti l'origine del rendering in avanti. Dovrai anche evidenziare il nuovo punto iniziale.

Se lo spostamento compiuto (e non la posizione del proiettile) è maggiore della larghezza della picturebox, puoi allargarla (PictureBox.Size) o zoomare l'immagine (PictureBox.SizeMode).
aaa
04/06/10 17:02
walker93
l'applicazione già la mostro a schermo intero
la picture box di fondo è uniforme ,stesso colore non c'è un immagine solo lo sfondo colorato d'azzurro per il cielo
come faccio a capire che è zoomato???
aaa
05/06/10 0:21
paoloricciuti
Non ne capisco di VB però giusto una cosa: se il tuo problema è sapere la distanza percorsa dal proiettile le due formule da te usate funzionano. Infatti per passare da 900 a 100 percorre 200 passi (da 900 a 1000 e da 0 a 100) se invece il tuo problema è sapere dove atterra c'è un problema di fondo, visto che utilizzi la variabile fine che è+ effettivamente dove atterra il proiettile.
aaa
05/06/10 12:51
walker93
il problema è che se sparo a 45° gradi percorro ad esempio 160 px se sparo a 135° cioè stessa inclinazione ma all'indietro mi calcola una distanza differente sebbene non cambi la forza dello sparo

aaa
06/06/10 14:02
Il Totem
Io credevo che il problema fosse semplicemente disegnare opportunamente i risultati, ma se le formule che hai usato danno risultati che contrastano con le tue ipotesi, allora il problema, come diceva paoloricciuti, è di fondo. Perciò sarebbe meglio se postassi il codice, in modo che possiamo vedere cosa non va.

P.S.: non calcoli anche la velocità del vento, vero? Altrimenti potrebbe dipendere da quello...
aaa
06/06/10 15:27
walker93
ecco ho messo le parti che ritengo rilevanti
'dentro al timer interval=10
        i += 0.15
        If i = 0.15 Then
            start = proiettile.Left + proiettile.Width
        End If
        proiettile.Left = proiettile.Left + velx * i
        'se supera il bordo destro(dist è la distanza)
        If proiettile.Left + proiettile.Width > sfondo.Width Then
            Threading.Thread.Sleep(200)
            dist += sfondo.Width - (proiettile.Left + proiettile.Width)
            proiettile.Left = 0
            'start = proiettile.Width
            indietro = False
            Threading.Thread.Sleep(200)
        ElseIf proiettile.Left < 0 Then 'altrimenti se supera quello sinistro
            Threading.Thread.Sleep(200)
            dist += -start 'proiettile.Left
            proiettile.Left = sfondo.Width - proiettile.Width
            'start = sfondo.Width + proiettile.Width
            Threading.Thread.Sleep(200)
            indietro = True
        End If
        If proiettile.Top + proiettile.Height >= sfondo.Top Then 
            'se va sotto terra lo fermo
            i = 0
            Timer1.Enabled = False
            proiettile.Top = sfondo.Top - proiettile.Height
            If start < proiettile.Left Then
                dist += (proiettile.Left - start) 
'vecchi tentativi: 
'-sfondo.Width - proiettile.Left + proiettile.Width
'-((proiettile.Left - start) + mom)
            Else
                dist += (start - proiettile.Left) 
'-proiettile.Left + proiettile.Width - start
            End If
            dimax.Text = dist \ 10
            mom = 0
            dist = 0
        End If

no niente vento...
Ultima modifica effettuata da walker93 06/06/10 15:30
aaa
08/06/10 18:15
Il Totem
Non riesco bene a carpire il preciso funzionamento di quel codice, anche se mi sono chiare le linee generali.
Forse sarebbe meglio se spezzassi adeguatamente i compiti. Assumiamo che il codice sia in un timer:
'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
aaa