Algorithme de déplacement : calculer un angle
Bonjour,
J'ai besoin de faire en sorte qu'un objet fixe soit toujours tourné vers un point mobile, sur un plan orthonormé (2D).
J'utilise donc la fonction tan ex :
Code:
1 2
|
angle = (Math.tan((World.x - Objet.x) / (World.y-Objet.y))*(180/Math.PI)); |
Cela fonctionne cependant je suis obligé de mettre des conditions lorsque une valeur ou l'autre est inférieur...Du coup je bricole un peu la chose par exemple :
Code:
1 2 3 4 5 6 7 8
|
if ( Math.abs(Game.x - x) < Math.abs(Game.y - y) ){
if ( Game.y - y > 0 ){
d = (Math.tan((Game.x - x) / (Game.y-y))*(180f/(float)Math.PI))-90f;
}else{
d = (Math.tan((Game.x - x) / (Game.y-y))*(180f/(float)Math.PI))+90f;
}
} |
Déjà j'aime pas ce genre de bricolage est il vraiment nécessaire ou connaissez vous une façon plus simple pour obtenir le résultat sans mettre 36000 conditions ?
En plus, lorsque j'arrive sur les bords l'angle qui en résulte devient légèrement plus grand ce qui fait une saccade quand on passe de l'un à l'autre.
Merci si vous pouvez m'aider.
Algorithme de déplacement : calculer un angle
Bonjour, :D
Si c'est un problème de poursuite, le chasseur (A) se déplace constamment vers la position actuelle de la la cible (B), indépendamment du déplacement simultané de cette dernière.
En notant (r) la distance séparant les positions courantes des deux points
r = ((xB - xA)2 + (yB - yA)2)1/2
le déplacement de (A) dans l'intervalle de temps (DeltaT) considéré est représenté par le vecteur
DeltaA = (VA*DeltaT/r).((xB - xA).Ux + (yB - yA).Uy) .
(B) sera rattrapé dès lors qu'il se déplace à une vitesse plus faible: VB < VA .
Si l'on s'intéresse au changement de l'orientation du tir, il suffit de considérer les valeurs successives du vecteur (AB) à deux instants consécutifs:
P = AB(t)
P1 = AB(t + DeltaT) = P + DeltaT.(VB - VA)
puis de calculer le déterminant correspondant:
Det(P, P1) = (P, P1, Uz) = (P*P1)*Sin(u)
qui s'exprime en fonction de l'écart angulaire entre les deux vecteurs:
u = (P, P1) = Arcsin(Det(P, P1)/(P*P1)) .