Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Déterminer un angle orienté de 2 vecteurs

Posté par
Jiji-Sensei
31-08-12 à 00:43

Bonjour, dans le cas d'un projet personnel en Javascript, je souhaite créer mon propre logiciel de graphisme. Pour la sélection des couleurs, j'utilise un cercle TSL (Teinte / Saturation / Luminance) qui a la particularité de coder une couleur pure (teinte) par rapport à un angle compris en 0 et 360° (pour la culture G : La luminance détermine l'intensité du blanc ou du noir de la couleur et la saturation l'intensité de la teinte).

On représente ainsi les couleurs par un cercle chromatique comme ci-dessous (merci Wikipedia) :

Déterminer un angle orienté de 2 vecteurs

Voilà pour les explications. Maintenant, mon gros soucis est de déterminer un angle (choisi par l'utilisateur) pour en restituer une teinte.

Pour cela, je connais 3 points :
                          O l'origine du cercle
                          A qui appartient au cercle et de coordonnées (r, 0) (r rayon)
                          B quelconque appartenant au cercle

Grâce à ces 3 points et mes souvenirs pas si vieux que ça, j'ai décidé d'utiliser le produit vectoriel -> . = |||| . |||| . cos(, )

Déterminer un angle orienté de 2 vecteurs

Bref avec quelques transformations, j'aboutis à cette forme : (, ) =  acos(( . ) / (|||| . ||||))

Le soucis c'est que le résultat (que je transforme en degré) est toujours compris entre [0 ; 90[ et je ne vois pas / plus pourquoi. J'ai cherché aussi sur internet et j'ai vu que l'on peut calculer ce qu'on appelle le déterminant à la place du sinus pour avoir l'angle orienté (det = xa * yb - ya * xb). Et en ajoutant cette donnée, je me retrouve avec des angles négatifs à [ / 2 ; ] [3 / 4 ; 2] (sans dire de bêtises je l'espère).

Si quelqu'un peut m'expliquer pourquoi mon angle calculé ne pas dépasser 90, m'expliquer d'où vient cette histoire de déterminant et résoudre mon problème en passant, il aura le droit d'être dans les crédits

P.S. : Si vous voulez voir un peu à quoi ça ressemble et constatez vous même mon histoire des angles qui ne varie pas au delà de 90, c'est là

Posté par
LeDino
re : Déterminer un angle orienté de 2 vecteurs 31-08-12 à 01:04

./r² doit te retourner un cosinus, donc entre -1 et 1.
Et donc arccos de cette grandeur doit te retourner un angle entre 0 et Pi.
Si tu veux connaître le sens de l'angle, c'est simple, il a le signe de l'ordonnée de (ou de B si tu préfères).

Donc ton expression pour l'angle est bonne, mais il faut la multiplier par signe(yB).

Posté par
LeDino
re : Déterminer un angle orienté de 2 vecteurs 31-08-12 à 01:07

Si tu ne veux pas d'angle négatif, alors lorsqu'il l'est, tu lui ajoutes 2Pi bien sûr...
Et tu auras un angle continu entre 0 et 2Pi (donc entre 0° et 360°)...

Posté par
Tiwaz
re : Déterminer un angle orienté de 2 vecteurs 31-08-12 à 02:41

Citation :
j'ai décidé d'utiliser le produit vectoriel ...

Sa c'est le produit scalaire, et ton histoire de déterminant et de sinus c'est le produit vectoriel.

Dans ton cas OA est un vecteur fixe qui correspond à l'axe des abscisses donc tu cherches simplement l'angle entre la droite (OB) et l'axe des abscisses donc si le vecteur OB = (x, y) on a:
    x = ||OB||cos
Et comme l'a expliqué LeDino tu calcules ton acos et tu tiens comptes du signe de y.

Sinon t'as la fonction Math.atan2(y, x) qui te donne l'angle directement entre - et .
Du coup en reprenant le code de ta démo tu peut simplifier en :

    var vecteur_OD = new Vecteur(origine, destination);
    var teta = Math.atan2(vecteur_OD.y, vecteur_OD.x);

Et pour les coordonnées du curseur :

    var proche = new Point(origine.x + rayon * Math.cos(teta), origine.y + rayon * Math.sin(teta));

Posté par
Crk
Fondamental angle entre vecteurs 17-11-13 à 13:06

Fondamentalement, un angle entre 2 vecteurs dépends du côté suivant lequel on regarde! Par le dessus ou par le dessous: les angles ne sont pas les mêmes d'où ambiguïté.

Il faut se donner un troisième vecteur pour avoir un angle sans ambiguïté.

Dans l'exemple de Jiji-Sensei, le troisième vecteur est le vecteur "y" vertical. Ainsi les réponses de LeDino sont correctes grâce au sous-entendu que ce vecteur "y" existe dans le problème posé.

En application 3D c'est plus compliqué: quand on veut un angle entre 2 vecteurs, alors il faut se donner un troisième vecteur. En fait le troisième vecteur le plus approprié est celui suivant lequel on projette le plan contenant les 2 vecteurs. Ainsi l'on voit les 2 vecteurs vus suivant le troisième. Et l'on lève facilement l'ambiguïté de savoir si l'on regarde les 2 vecteurs par le dessus ou par le dessous!

Sans ce troisième vecteur, il ne saurait y avoir de dessus ou dessous bien défini!

Posté par
LeDino
re : Déterminer un angle orienté de 2 vecteurs 17-11-13 à 15:32

C'est bien.
Comme ça si jamais Jiji-Sensei veux programmer son interface en 3D... il sait quoi faire dorénavant .



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !