Angles

PijanaKrava Messages postés 26 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 décembre 2004 - 1 mars 2004 à 16:07
PijanaKrava Messages postés 26 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 décembre 2004 - 5 mars 2004 à 18:55
Yop tt le monde

voilà g un chti problème avec une appli VC++ ke je dois faire.
Voilà g 3 points dont g les coordonnées et je dois calculer l'angle formé par les segments formés par ces 3 points.
J'utilise cette fonction à ki je passe un tableau contenant les coord sous la forme x1,y1,x2,y2,x3,y3 et ds la f° j'essaye de faire les calculs grace au prod scalaire mais les résultats sont pas hyper probants

int calculAngle(int *coord)
{
int angle, X1, X2, Y1, Y2;
double dist21, dist23, prodScal, cos, phi;

X1 = *(coord) - *(coord + 2);
Y1 = *(coord + 1) - *(coord + 3);
X2 = *(coord + 4) - *(coord + 2);//
Y2 = *(coord + 5) - *(coord + 3);//
//calcul du produit scalaire
prodScal = (double) ((X1 * X2) + (Y1 * Y2));
dist21 = hypot((double) X1, (double) Y1);
dist23 = hypot((double) X2, (double) Y2);
cos = prodScal / (dist21 * dist23);
phi = acos(cos);
angle = (int) floor(phi);
return angle;
}

si quelqu'un a une idée lumineuse je suis preneur
merci d'avance

6 réponses

cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
1 mars 2004 à 18:31
Salut

Il y a apparemment quelques problèmes dans le programme :

Travailles-tu avec des int ou avec des double?

La fonction acos te renvoie-t-elle le résultat voulu ?

float Angle(Xa, Ya, Xb, Yb, Xc, Yc)
{
// renvoie l'angle entre les vecteurs BA et BC
float rtn, cos, sin, Xba, Yba, Xbc, Ybc ;
// Ce sont en réalité l'inverse des normes :
float NormeBA, NormeBC ;
Xba Xb - Xa ; Yba Yb - Ya ; Xbc Xb - Xc ; Ybc Yb - Yc ;
if ( (Xba 0.0f && Yba 0.0f) || (Xbc 0.0f && Ybc 0.0f) )
{
printf("Erreur...\nVecteur null...\a\n") ;
return 0 ;
}
NormeBA Xba * Xba + Yba * Yba ; NormeBA powf(NormeBA, -.5f) ; NormeBC Xbc * Xbc + Ybc * Ybc ; NormeBC powf(NormeBC, -.5f) ;

// Le cosinus de l'angle est le produit scalaire divisé par le produit des normes.
cos = ( ( Xba * Xbc ) + ( Yba * Ybc ) ) * NormeBA * NormeBC ;

// Le sinus de l'angle est le déterminant divisé par le produit des normes.
sin = ( ( Xba * Ybc ) - ( Yba * Xbc ) ) * NormeBA * NormeBC ;

if ( sin >= 0 ) return acosf(cos) ;
else return -acosf(cos) ;

return rtn ;
}

Voila je n'ai pas testé mais je pense que c'est correct.

A++

Chouchou
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
1 mars 2004 à 18:33
OUps

Désolé mais la variable rtn ne sert strictement à rien donc elle est à enlever.

Courage

Chouchou
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
1 mars 2004 à 19:00
Encore bétise de ma part

Je crois qu'il vaut mieux retourner PI - acosf(cos) ;

Maiss il vaut mieux étudier en détail le fonctionnement de cette fonction parce que j'ai encore des doutes

Désolé pour mes erreur et bonne prog

Chouchou
0
PijanaKrava Messages postés 26 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 décembre 2004
2 mars 2004 à 14:06
merci pour ta tantative chouchou mais ça morche tjs po :'(
le monde est trop injuste !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
5 mars 2004 à 18:38
#include
#include <cstdio>
#include <cmath>

#define PI 3.1415926535f

float Angle(float Xa, float Ya, float Xb, float Yb, float Xc, float Yc)
{
// renvoie l'angle entre les vecteurs BA et BC
float cos, sin, Xba, Yba, Xbc, Ybc ;
// Ce sont en réalité l'inverse des normes :
float NormeBA, NormeBC ;
Xba Xb - Xa ; Yba Yb - Ya ;Xbc Xb - Xc ; Ybc Yb - Yc ;
if ( (Xba 0.0f && Yba 0.0f)|| (Xbc 0.0f && Ybc 0.0f) )
{
printf("Erreur...\nVecteur null...\a\n") ;
return 0 ;
}
NormeBA Xba * Xba + Yba * Yba ; NormeBA pow(NormeBA, -.5f) ;NormeBC Xbc * Xbc + Ybc * Ybc ; NormeBC pow(NormeBC, -.5f) ;

// Le cosinus de l'angle est le produit scalaire divisé par le produit des normes.
cos = ( ( Xba * Xbc ) + ( Yba * Ybc ) ) * NormeBA * NormeBC ;

// Le sinus de l'angle est le déterminant divisé par le produit des normes.
sin = ( ( Xba * Ybc ) - ( Yba * Xbc ) ) * NormeBA * NormeBC ;

printf("cos %s ; sin %s\n", cos < 0.0f ? "negatif":"positif", sin < 0.0f ? "negatif":"positif") ;

if ( sin >= 0 ) return acos(cos) ;
else return -acos(cos) ;
}

int main() {
float * Coordonnees = new float[6] ;
cout << "Entrez les coordonn\202es des trois points :\n\tXa ? " ;
cin >> Coordonnees[0] ;
cout << "\n\tYa ? " ;
cin >> Coordonnees[1] ;
cout << "\n\tXb ? " ;
cin >> Coordonnees[2] ;
cout << "\n\tYb ? " ;
cin >> Coordonnees[3] ;
cout << "\n\tXc ? " ;
cin >> Coordonnees[4] ;
cout << "\n\tYc ? " ;
cin >> Coordonnees[5] ;
cout << "\n" ;
float angle= Angle(Coordonnees[0],Coordonnees[1],Coordonnees[2],Coordonnees[3],Coordonnees[4],Coordonnees[5]) ;
cout << "L\'angle form\202 par les trois points A, B, C est de " << angle << " radians\n"
<< "\tsoit " << angle / PI * 180 << " degr\202s.\n" ;

delete[] Coordonnees ;
return 0 ;
}

Je ne vois pas ou est le problème

J'ai fait quelques tests et les résultats me semblainet corrects.

A++

Chouchou
0
PijanaKrava Messages postés 26 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 décembre 2004
5 mars 2004 à 18:55
c bon c bon ça marche
merci pour ton aide
0
Rejoignez-nous