Trouver angle deux vecteurs même origine 3D XYZ [Fermé]

Signaler
Messages postés
147
Date d'inscription
mardi 2 juin 2015
Statut
Membre
Dernière intervention
20 février 2018
-
Messages postés
16223
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2020
-
Bonjour,

Je cherche à calculer l'angle entre deux vecteurs 3d de même origine,
quelqu'un sait comment faire?
Mes deux vecteurs s'appellent AB et AC, et A = (0, 0, 0)
Merci d'avance.

2 réponses

Messages postés
16223
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2020
2 617
Bonjour,

C'est pas vraiment de l'informatique ça... c'est plutôt des maths !
https://fr.wikipedia.org/wiki/Produit_scalaire
Messages postés
147
Date d'inscription
mardi 2 juin 2015
Statut
Membre
Dernière intervention
20 février 2018
13
C'est des mathématiques, mais pour un algorythme, donc je pense que ça rentre dans le cadre de l'algorythmique ^^ je vais voir merci
Messages postés
3644
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
879
Je ne vois pas d'algorithmique là-dedans.
Cela s'écrit en une assignation triviale.
Tu ne précises aucun langage.
Effectuer une somme de 3 produits , extraire 2 racines carrées (non nulles) .... une division et un arc_cosinus ne demandent pas beaucoup de méditation.
En Python (très vite rédigé et à peaufiner):
import math

def get_angle( v1, v2) :
    if isinstance(v1, list) and isinstance(v2, list) and len(v1)==len(v2) :
        p = 0
        for i in range( len(v1)) :
            p += v1[i] * v2[i]
            
        n1 = 0
        n2 =0
        for i in range( len(v1)) :
            n1 += v1[i] * v1[i]
            n2 += v2[i] * v2[i]

        if  0 == n1 * n2 :
            raise ValueError('No parameter should be a zero vector')

        return math.acos( p /math.sqrt(n1 * n2))

    else:
            raise TypeError('Bad parameters')
print get_angle([0, 0, 1], [1, 0, 0])
# print get_angle([0, 0, 1], 1)
print get_angle([0, 0, 0], [1, 1, 1])

johand@bata:~/src/CCM/PYTHON$ python angle.py
1.57079632679
Traceback (most recent call last):
File "angle.py", line 21, in <module>
print get_angle([0, 0, 0], [1, 1, 1])
File "angle.py", line 16, in get_angle
raise ValueError('No parameter should be a zero vector')
ValueError: No parameter should be a zero vector
Messages postés
147
Date d'inscription
mardi 2 juin 2015
Statut
Membre
Dernière intervention
20 février 2018
13 >
Messages postés
3644
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017

Merci de ces réponses, alors de 1 : il s'agit (vous auriez pu deviner) de maths pour de la représentation en 3d, donc c'est de la programmation, de 2 : je parle de méthode, donc évidemment que je ne précise pas de langage, c'est juste un problème de méthode, que j'essaie detrouver, que je pourrai rédiger moi même en forme de code, et si j'avais précisé le langage, j'aurais juste perdu des chances de trouver une réponse.
sinon merci je vais regarder ce que tu as fait
Messages postés
16223
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2020
2 617
La "méthode" c'est à dire la "théorie" c'est des maths...

Résumé des produits scalaires :
OA.OB = ||OA|| * ||OB|| * cos(AÔB)

D'où
AÔB = arccos(OA.OB / (||OA|| * ||OB||))


Or
OA.OB=(xA-xO)(xB-xO)+(yA-yO)(yB-yO)+(zA-zO)(zB-zO)

Et
||OA|| = √((xA-xO)²+(yA-yO)²+(zA-zO)²)
, idem pour
||OB||
.

On mélange le tout et ça donne AÔB...

Dans le cas particulier de O(0,0,0) ça se simplifie :
AÔB=arrcos((xA*xB+yA*yB+zA*zB)/(√(xA²+yA²+zA²)*√(xB²+yB²+zB²))

Et j'enfonce le clou : ça ce n'est pas un algorithme, c'est une formule de maths...