calcul d'un angle entre 2 vecteurs en c++ (en respectant le signe)

calcul d'un angle entre 2 vecteurs en c++ (en respectant le signe) - C++ - Programmation

Marsh Posté le 26-04-2007 à 19:18:31    

Bonjour à tous  :hello:  
 
j'ai un petit problème de calcul de l'angle entre les 2 vecteurs, sachant que je sais comment le faire mais la maniére que je fais, le calcul de l'angle j'aurai toujours un angle positive, et c'est là le problème, puisque l'angle pourra être positive ou bien négative!!!
Je fais le calucul du produit scalaire de 2 vecteur AB et AC, pour avoir le cosinus entre ces vecteurs et puis je fais acos(cos(BÂC))!!!! Mais avec cette méthode j'ai une résultat toujours positive, vous pouvez me proposer une autre méthode pour avoir le signe réel de l'angle BÂC????? Merci  :sarcastic:  
 
P.S. : il y aussi une autre méthode aussi pour le faire calculer c'est de calculer l'angle entre le vecteur AB et l'horizontal(Alpha), puis la même chose pour le vecteur AC(Beta). Donc, l'angle entre les deux sera BÂC=Alpha-Betta!!!! Mais comment l'appliquer en c++????
 
Je vous remercie. :jap:

Reply

Marsh Posté le 26-04-2007 à 19:18:31   

Reply

Marsh Posté le 26-04-2007 à 19:21:43    

pour connaitre le vrai signe de l'angle, il te suffit de calculer le signe de son sinus.


---------------
TriScale innov
Reply

Marsh Posté le 26-04-2007 à 19:47:20    

donc, je fais ça aprés le calcul de l'angle???????
je fasse le calcul de signum de son sinus????? ou bien comment merci de m'éclairtie ton poit de vue .

Reply

Marsh Posté le 26-04-2007 à 20:30:29    

acos et asin n'est défini que dans [-pi/2,pi/2].
Il faut ajuster le signe selon le cadran, et donc le signe du cos et du sin
car pour la machine, acos(-3/4) == acos(3/-4) alors que ça pas le cas en trigo


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 26-04-2007 à 20:56:48    

jagstang a écrit :


car pour la machine, acos(-3/4) == acos(3/-4) alors que ça pas le cas en trigo


 
ha

Reply

Marsh Posté le 26-04-2007 à 20:58:16    

avec le produit scalaire ==> cos
avec le produit vectoriel ==> sin
 
avec les 2 on peux trouver le signe

Reply

Marsh Posté le 26-04-2007 à 21:11:29    

alors je calcul le produit scalaire entre les 2 puis le produit vectoriels, ça va me donner le sinus et le cosinus et pour avoir l'angle je fais comment??? comme ça ??
BÂC = sign(produit vectoriel)*acos(produit scalaire);
 
mais comment calculer le sign en c++????

Reply

Marsh Posté le 26-04-2007 à 21:53:43    

rappel :  
u ^v = ||u|| ||v|| sin(u,v)
u . v = ||u|| ||v|| cos(u,v)
 
pour un cos donné il y a 2 angles entre [0, 2*pi[ qui correspondent : pour sin>0 et sin<0 (quand l'angle est nulle l'angle est le meme = 0)
 
pour t'en convaincre revient au cercle trigonometrique (cercle de rayon 1, avec cos=abscisse, sin=ordonne d'un point du cercle)

Reply

Marsh Posté le 26-04-2007 à 21:58:22    

et pour etre plus precis :

Code :
  1. double angle(u, v)
  2. {
  3.    // calculer c, s : cosinus et sinus de (u,v)
  4.    if (s>0)
  5.       return acos(c);
  6.    else
  7.       return -acos(c);
  8. }


 
technique 2:

Code :
  1. double angle(c, s)
  2. {
  3.     if (fabs(c)<eps) // eps tres petit a definir
  4.        return 0.
  5.     else
  6.        return atan(s/c);
  7. }


Reply

Marsh Posté le 26-04-2007 à 23:46:21    

j'ai encore un petit problème, le calcul de sinus=le produit vectoriel
le produit vectoriel se calcule de la maniere suivante.
Ux = Vy * Wz - Wy * Vz;
Uy = Vz * Wx - Wz * Vx;
Uz = Vx * Wy - Wx * Vy;  
 
alors sinus sera un double de 3 dimensions comment pourrai-je faire la condition avec ce sinus. je pourrai calcule la norme de ce sinus pour qu'il soit en double, mais dans ce cas là je perd le signe de l'angle????? comment pourrai-je garder le signe de sinus???

Reply

Marsh Posté le 26-04-2007 à 23:46:21   

Reply

Marsh Posté le 27-04-2007 à 09:13:37    

hamoudasafira1 a écrit :

j'ai encore un petit problème, le calcul de sinus=le produit vectoriel


Non.
tu oublies le produit des normes.
 

hamoudasafira1 a écrit :


le produit vectoriel se calcule de la maniere suivante.
Ux = Vy * Wz - Wy * Vz;
Uy = Vz * Wx - Wz * Vx;
Uz = Vx * Wy - Wx * Vy;  
 
alors sinus sera un double de 3 dimensions


NON §§§
 

hamoudasafira1 a écrit :

comment pourrai-je faire la condition avec ce sinus. je pourrai calcule la norme de ce sinus pour qu'il soit en double, mais dans ce cas là je perd le signe de l'angle????? comment pourrai-je garder le signe de sinus???


 [:ciler]  


---------------
Töp of the plöp
Reply

Marsh Posté le 27-04-2007 à 11:23:21    

hamoudasafira1 a écrit :

j'ai encore un petit problème, le calcul de sinus=le produit vectoriel
le produit vectoriel se calcule de la maniere suivante.
Ux = Vy * Wz - Wy * Vz;
Uy = Vz * Wx - Wz * Vx;
Uz = Vx * Wy - Wx * Vy;  
 
alors sinus sera un double de 3 dimensions comment pourrai-je faire la condition avec ce sinus. je pourrai calcule la norme de ce sinus pour qu'il soit en double, mais dans ce cas là je perd le signe de l'angle????? comment pourrai-je garder le signe de sinus???

Bon, je crois qu'il serait bon que tu te replonges dans tes bouquins de maths de Lycée (ou peut-être même avant).
 
Déjà, tes vecteurs ils sont en 2D ou 3D ?
 
S'ils sont en 2D (i.e. avec Vz=Wz=0 dans l'expression ci-dessus), alors seule la coordonnée Uz est non nulle dans l'expression ci-dessus. C'est le signe de Uz qui te donne l'orientation de l'angle.
 
S'ils sont en 3D, alors je t'engage à réfléchir à la notion d'angle orienté en 3D, qui n'est pas si simple que cela. Je ne pense pas que tu sois dans ce cas là, alors je ne développe pas plus...


---------------
TriScale innov
Reply

Marsh Posté le 27-04-2007 à 15:17:03    

mes vecteurs sont en 3D, et puis je sais faire le calcul de l'angle entre les 2 vecteurs en plusieurs méthodes, mais ce n'est pas ça le probléme, le problème c'est que je dois garder le signe de l'angle tel qu'il est en faisant le acos(cosA), je perd le signe et en calculant la norme de sinusA je perd aussi le signe de l'angle. Donc la solution pas seulement mathématiques mais aussi informatique de résourdre ce problème??????

Reply

Marsh Posté le 27-04-2007 à 15:18:07    

hamoudasafira1 a écrit :

Donc la solution pas seulement mathématiques mais aussi informatique de résourdre ce problème??????


 
100 balles et un mars ?


---------------
Töp of the plöp
Reply

Marsh Posté le 27-04-2007 à 15:41:56    

on sait que AB.BC=||AB||||BC||Cos(ABC)
 
on tire comme cela le cosinus de l'angle, le soucis c'est que un angle et son oppposé on le même cosinus il faut donc déterminer le signe du sinus, par exemple avec le produit vectoriel
On plonge nos 2 vecteurs Ab et BC dans l'espace en rajoutant une coordonnée nulle ex: si AB(1,2)->AB(1,2,0)
 
On calcule le produit vectoriel de nos deux nouveaux vecteurs ce qui nous donne un troisième vecteur orthogonal au plan de base dans l'espace donc de la forme (0,0,k) et on regarde le signe de k pour savoir de quel coté se place BC par rapport à AB: si k>0 on doit tourner dans le sens inverse des aiguille d'une montre pour amener AB sur BC.
 
ça est une hypothése, sauf que je travail en 3D; donc je ferai comment dans ce cas là????

Reply

Marsh Posté le 27-04-2007 à 22:13:51    

Bonsoir,
 
en fait apres relecture de mon ancien post et avec ce que tu dis :
l'angle "signé" de 2 vecteurs 3D n'a pas de sens en 3D si tu definie pas d'abord l'orientation dans ton plan des 2 vecteurs !
 
ie il faut te donne un plan et une orientation !!
 
tu peux te documenter ici http://fr.wikipedia.org/wiki/Angle [...] ent.C3.A9s

Reply

Marsh Posté le 26-03-2011 à 18:25:49    

Bonjour a tous,
j'ai un problème de calcul de l'angle orienté (angle geometrique) entre 2 vecteurs de dim n. x(x1,x2,...,xn) et y(y1,y2,...,yn)
j'ai un problème de déterminer le signe de l'angle par le méthode de produit vectoriel de deux vecteurs de dim n (u ^v = ||u|| ||v|| sin(u,v) ).
Je vous remercie && Bon weekend

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed