Calcolo della velocità minima del proiettile necessaria per colpire il bersaglio nell'arco parabolico


Risposte:


15

La funzione di vassoio parabolico è definita come:

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • Valori noti:

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
  • Valori sconosciuti:

    Vo: Initial Velocity
  • Per calcolare 'Vo', possiamo dare valori alla funzione F:

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
  • Ora puoi ottenere tutti i valori per raggiungere l'obiettivo dall'origine dando valori a t nell'equazione F:

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      

Bella risposta. renditi conto che g non è firmato. all'aumentare di g, anche Voy dovrebbe aumentare.
milkplus,

Come si conosce t (tempo necessario per l'impatto)?
Dewald Swanepoel,

13

Di recente ho dovuto risolvere un problema simile, ho trovato due soluzioni, basate sulla formula che ho trovato nella pagina di Wikipedia "Dan the Man" già menzionata: Traiettoria di un proiettile

In questa soluzione è necessario in ogni caso l'angolo di lancio fisso o la velocità x. La velocità Y non è necessaria quando lanciamo il proiettile in un angolo specifico.

Soluzione 1, l'angolo di lancio è fisso, calcola la velocità:

g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity

Soluzione 2, la velocità è fissa, calcola l'angolo di lancio:

g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle

Nel mio caso questa soluzione ha funzionato abbastanza bene.


2

Se non ti interessa se è matematicamente corretto, solo che sembra abbastanza corretto, calcola il percorso rettilineo e fai seguire al tuo proiettile quel percorso, ma "spingilo su" lungo il normale di quella linea in funzione della sua distanza in basso il segmento di linea, quindi aumenta man mano che si avvicina al centro del segmento e diminuisce man mano che si allontana dal centro del segmento di linea.

Per questo potresti usare un'onda sinusoidale, usando l'intervallo di gradi da -90 a +90 (dove -90 è il punto sinistro sul segmento di linea, 90 è il punto giusto e ti muovi nel mezzo), e moltiplica il risultato da una costante per ridimensionarlo.

Se hai bisogno della risposta matematica / fisica puramente corretta, questo non sarà di aiuto. In caso contrario, probabilmente questo potrebbe funzionare abbastanza bene per te!

Non dimenticare, la programmazione del gioco riguarda l'uso di illusioni che sembrano corrette (e sono più economiche da calcolare), invece del realismo.


7
Ri: "usando illusioni che sembrano corrette (e sono più economiche da calcolare)", concordo in generale, ma in questo caso sembra un po 'sciocco, dato quanto sia facile ed economico usare l'arco parabolico matematicamente corretto.
Nathan Reed,

1
È vero che questa sembra una semplificazione superflua, ma non penso che questa risposta sia negativa in senso negativo, e non meriti il ​​voto negativo (anche se non merita molti voti positivi).
Sarà il

In realtà se stai per usare un'onda sinusoidale, dovrebbe essere 0 a 180 (o 0 per pi in radianti)
Daniel Kaplan

2

Se hai solo bisogno di qualcosa che è giusto e hai una velocità fissa, puoi usare questo metodo molto semplificato.

distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;

La distanza può essere negativa ma funzionerà comunque perché anche l'angolo dipende dalla distanza. Se la distanza è negativa, anche l'angolo che deve essere aggiunto è negativo.

Dovrai giocare con distanceFactor per trovare il giusto valore. Dipende dalla gravità e dalla potenza del proiettile. Dovrebbe essere vicino a 1 diviso per la distanza massima che il proiettile può coprire.


1
Dritta. Quando ho provato il tuo codice, hai avuto cos e sin all'indietro. Ho modificato il tuo codice, quindi dovrebbe essere corretto.
Mr Valdez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.