2009-12-29 4 views
0

J'ai besoin d'implémenter un peu d'IA pour comprendre comment frapper une cible avec un mouvement de projectile.Besoin d'aide pour déchiffrer une formule de mouvement de projectile

Je trouve cela plus à wikipedia:

Angle required to hit coordinate

qui ressemble juste la chose que je dois, d'autant plus que j'ai le problème supplémentaire de lancer le projectile au-dessus de zéro hauteur. Cependant, mes compétences en maths ne sont pas géniales, donc tout cela me semble complètement absurde et je n'ai aucune idée de comment traduire tout ça en code.

Si quelqu'un peut décomposer cela en quelque chose que je peux comprendre avec les opérateurs de base (+ - *%) et les fonctions (sin, cos, sqrt etc.), je l'apprécierais vraiment.

Répondre

7

Si xTarget/yTarget est la position de la cible, xProj/yProj la position initiale du projectile et v la vitesse initiale du projectile (en mètres par seconde), la formule se traduirait par le pseudo-code suivant:

x = xTarget - xProj; 
y = yTarget - yProj; 
g = 9.8; 

tmp = pow(v, 4) - g * (g * pow(x, 2) + 2 * y * pow(v, 2)); 

if tmp < 0 
    // no solution 
else if x == 0 
    angle1 = pi/2; 
    if y < 0 
     angle2 = -pi/2; 
    else 
     angle2 = pi/2; 
    end 
else 
    angle1 = atan((pow(v, 2) + sqrt(tmp))/(g * x)); 
    angle2 = atan((pow(v, 2) - sqrt(tmp))/(g * x)); 
end 

g est la constante gravitationnelle (~ 9,8 m/s^2), atan est la arcus tangente fonction et pow est la fonction de puissance. L'instruction if est nécessaire, car la formule ne peut avoir aucune solution (si la cible n'est pas accessible avec la vélocité initiale), une solution (alors angle1 == angle2) ou deux solutions (comme on peut le voir dans l'animation this, c'est aussi pourquoi avoir le signe +/- dans la formule).

Dans la plupart des langages de programmation, vous trouverez également atan2, dans ce cas, vous devriez être en mesure de remplacer un code avec

if tmp < 0 
    // no solution 
else 
    angle1 = atan2(pow(v, 2) + sqrt(tmp), g * x); 
    angle2 = atan2(pow(v, 2) - sqrt(tmp), g * x); 
end 
+2

Je pense que vous avez quitté vos atans. Aussi, faites attention à x = 0 (la cible est directement au-dessus de vous?) ... divisez par zéro. –

+0

Vous avez raison, merci. – Lucas

2

La formule est assez simple, ne vous inquiétez pas de la dérivation.

x is the horizontal distance away of the target you're trying to hit 
y is the vertical distance away of the target you're trying to hit 
v is the initial velocity of the launch 
g is the acceleration due to gravity (9.81 m/s on earth) 

et la formula on that link vous donnera l'angle que vous devez lancer le projectile afin d'atteindre la cible de la coordonnée (x, y)

Questions connexes