Bonjour à tous !!
J'aimerais savoir comment on peut faire pour calculer l'angle entre deux segments, les deux segments ayant une extremité commune.
Merci.
Bonjour à tous !!
J'aimerais savoir comment on peut faire pour calculer l'angle entre deux segments, les deux segments ayant une extremité commune.
Merci.
Tu peux utiliser le produit scalaire. En utilisant les definitions suivantes :
- AB : vecteur de A a B
- AC : vecteur de A a C
- | |: norme des vecteur (longeur (positif))
- BAC: angle entre le sommet A et les points B et C
Le produit scalaire . s'ecrit de la maniere suivante:
AB.AC=|AB|*|AC|*cos(BAC)
Et donc tu peux recuperer l'angle :
Et donc si tes vecteurs sont normes, l'angle est simplement l'arccos du produit scalaire !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 angle=arccos( prodscal(AB,AC) / (norm(AB)*norm(BC)) )
1)Avant de poster, merci de lire les règles. 2)Utiliser [code] [/code] pour quoter le code ! 3)Conseils pour le forum C [a lire en entier!]
cos(alpha) = Y , et cos(-alpha) vaut aussi Y
Si on a un cosinus qui vaut Y, quelle sera la valeur retournée par arccos(Y) ? alpha ou -alpha ?
A mon avis, la méthode proposé dans le message ci-dessus est imprécise.
Je propose :
- calculer l'angle de AB par rapport à l'horizontale (alpha)
- calculer l'angle de AC par rapport à l'horizontale (béta)
- l'angle entre AB et AC vaut béta moins alpha dans tous les cas
Pour calculer l'angle d'un segment par rapport à l'horizontale, je propose d'utiliser la fonction suivante :
(avec pour AB :
DeltaX = XB - XA
DeltaY = YB - YA
pour AC :
DeltaX = XC - XA
DeltaY = YC - YA)
Si vous avez une meilleure méthode ou des améliorations à proposer, je suis preneur !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 //------------------------------------------------------------------ // // AngleCorrige // // Renvoie un angle en radians en fonction du DeltaX et DeltaY // //------------------------------------------------------------------ inline REEL vBulle::AngleCorrige(REEL DeltaX,REEL DeltaY) { const double Pi=3.141592654;// Pi REEL Angle; //Cas particulier pour fonction Atn (Atan en C) if (DeltaX == 0) { if (DeltaY < 0) Angle = -Pi/2; else Angle = Pi/2; } //Cas "Normaux" else { Angle = atan(DeltaY / DeltaX); if (DeltaX < 0) Angle = Angle + Pi; } //Récupération d'un résultat positif if (Angle < 0) Angle = Angle + 2 * Pi; return Angle; }
alpha. arcos renvoie des valeurs entre 0 et pi et est defini sur [-1,1]Si on a un cosinus qui vaut Y, quelle sera la valeur retournée par arccos(Y) ? alpha ou -alpha ?
arctan renvoie entre -pi/2 et pi/2 et est defini sur ]-inf,inf[
Je pense que l'on ne peut pas ameliorer beaucoup ton algo car dans tous les cas il faut calculer au moin un arccos, un arcsin ou un arctan, et definir dans quel moitie de cercle on se situe. Reste a savoir si arccos est plus rapide que arctan.
slt;
c'est peut être un peu tard et tu as certainement déjà trouvé la solution à ton pb (je veux bien la connaitre).
Cependant si tu peux utiliser un produit scalaire tu peux utiliser des repères et donc des changements de repères. En prenant un repère orthogonal (il n'a pas besoin d'être normé) avec comme axe un te tes segments, le signe des coordonnées de ton autre segment (vecteur) te permettra de determiner le signe de l'angle calculé.
et hop.
Vive La Main Gauche
http://www.lamaingauche.org
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager