Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Maths/Espace 3D] Calculer l'angle entre 2 vecteurs

Sujet résolu
    28 juin 2010 à 23:58:22

    Bonjour, je sais que le titre n'évoque pas grand chose :-° mais voila, ce que je cherche a connaitre, c'est "l'inclinaison" entre deux points. Par exemple je me place dans un espace 3D (X,Y,Z), Y étant la hauteur (peu importe). Si on a deux points A(0,0,0) et B(1,1,1) l'inclinaison en X et Z entre les deux points est bien 90°. Bon là c'est facile mais c'est plus difficile avec des valeurs décimales, et je ne connais pas la formule (je connais la fonction atan2 mais je ne vois pas comment l'utiliser là :( ).
    • Partager sur Facebook
    • Partager sur Twitter
      29 juin 2010 à 0:13:10

      Si tu veux un angle, il te faut 3 points.

      A,B,C qui te font un "V" dans l'espace.

      pour trouver l'angle A (en position quelconque), considère les vecteurs AB et AC.

      Le produit scalaire AB.AC = ||AB||*||AC||*cos(A)
      ce que tu cherches, c'est donc A, qui sera :

      A = acos(AB.AC/(||AB||*||AC||))

      AB.AC = ABx*ACx + ABy*ACy + ABz*ACz
      ||AB|| = sqrt(ABx²+ABy²+ABz²)
      ||AC|| = sqrt(ACx²+ACy²+ACz²)

      L'angle A sera exprimé en Radians.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        29 juin 2010 à 0:16:22

        oui, dans mon cas le 3ème point est une projection d'un des deux autres points sur le même axe.

        Merci !

        edit: j'ai voulu faire un dessin mais il aime pas les espaces en début de ligne :lol:
        • Partager sur Facebook
        • Partager sur Twitter
          29 juin 2010 à 0:17:11

          Comprends pas, fait un schéma plus clair.
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            29 juin 2010 à 0:23:41

            On ne sait jamais (pour les anonymous), je ne vois qu'une seule chose à ajouter :

            A(Ax,Ay,Az), B(Bx,By,Bz), C(Cx,Cy,Cz)

            ABx = Bx-Ax
            ABy = By-Ay
            ABz = Bz-Az

            ACx = Cx-Ax
            ACy = Cy-Ay
            ACz = Cz-Az

            On est sur le site du zéro ou on ne l'est pas ! :p

            Citation

            oui, dans mon cas le 3ème point est une projection d'un des deux autres points sur le même axe.



            Really ?? Sur quel axe ? :o

            • Partager sur Facebook
            • Partager sur Twitter
            Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
              29 juin 2010 à 0:24:55

              En 3D, on peut dire qu'il y a deux angles, celui entre x et z et celui entre x et y pour ton cas où y est la hauteur mais ce n'est pas un problème, cela revient au même.

              On appellera le premier theta et le deuxième phi.

              Pour les calculer, on considère le rayon r, l'angle entre x et z theta et l'angle entre x et y phi.

              Tu peux t'inspirer de cette fonction pour coder ta fonction (attention, il faut savoir que cette fonction est faites pour que z soit la hauteur)

              void angle_deux_points (Pos A, Pos B, float &theta, float &phi)
              {
              	Pos difference;
              	difference.x = B.x - A.x;
              	difference.y = B.y - A.y;
              	difference.z = B.z - A.z;
              	// Tu rendras les différences toutes plus que 0 car les distances sont > 0
              
              	float r = ; // Tu la calculeras toi même 
              	float phi = asin( (difference.z) / r );
              	float teta = to_degre( asin( difference.x / (r * get_cos_rad(phi) ) ) ); // to_degre, tu coderas cette fonction, c'est facile : elle retourne le int que tu lui as passé en effectuant / M_PI * 180
              	// Tu coderas aussi get_cos_rad() qui prend le cos d'un radium
              	
              	teta = v.y < 0 ? 180+teta : -teta;
              	phi = to_degre(phi);
              


              r est la distance entre les deux points, ne me dis pas que tu ne sais pas calculer cela :D sinon tu peux faire une rechercher sur internet ou créer la formule toi même en utilisant pythagore.
              • Partager sur Facebook
              • Partager sur Twitter
                29 juin 2010 à 0:27:58

                Vu ton image.
                Si c'est l'axe des X, alors X(1,0,0) l'axe des Y est Y(0,1,0), Z est (0,0,1)

                Tout dépend sur quel axe tu projettes.
                En tout cas, il faudra considérer les 2 vecteurs : AB et X (ou AB et Y ou AB et Z)

                Et tu fais le calcul que j'ai mis plus haut :)
                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  29 juin 2010 à 0:29:15

                  Citation : adimux

                  En 3D, on peut dire qu'il y a deux angles, celui entre x et z et celui entre x et y pour ton cas où y est la hauteur mais ce n'est pas un problème, cela revient au même.

                  On appellera le premier theta et le deuxième phi.


                  Si tu as 3 points (ou 2 vecteurs) dans un espaces à 2 ou 3 dimensions (surment N dimensions même), il y a un seul angles, pas 2 (du moins pas usuellement).
                  • Partager sur Facebook
                  • Partager sur Twitter
                  FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                    29 juin 2010 à 0:30:42

                    Oui c'est vrai, mais l'auteur parlait au début de deux points pas de deux vecteurs :D .
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 juin 2010 à 0:31:03

                      D'où la question, sur quel axe tu projettes le point? Parce que au final c'est cet axe qui détermine l'angle. "Le même axe" tu dis. A part faire de la télépathie, ça va être difficile pour nous de déterminer lequel vu qu'ils se ressemblent tous (un peu).

                      @adimux: Really ? un angle entre deux points? Tu parles de coordonnées sphériques? Ca n'a pas nécessairement quelque chose à voir avec le problème à moins que celui-ci se précise.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
                        29 juin 2010 à 0:34:31

                        Citation : adimux

                        Oui c'est vrai, mais l'auteur parlait au début de deux points pas de deux vecteurs :D .


                        Quand je vois écrit A(x,y,z), B(x,y,z) dans un espaces à 3D et un angles entre les deux, je vois ca comme des vecteurs, sinon ca n'a aucun sens.

                        Pour la réponse : angle = acos(<a|b>/(|AB|*|AC|)) ou <|> est le produit sacalaire usuel sur R^3 et | | la norme associé, ce qui donne (en cartésien) angle = acos((x1*x2+y1*y2+z1*z2)/(sqrt(x1²+y1²+z1²)*sqrt(x2²+y2²+z2²)))

                        NB: Ce que j'ai écrit n'est pas mathématique parfait, mais devrait suffire.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                          29 juin 2010 à 0:46:48

                          Citation : Freedom

                          Citation : adimux

                          En 3D, on peut dire qu'il y a deux angles, celui entre x et z et celui entre x et y pour ton cas où y est la hauteur mais ce n'est pas un problème, cela revient au même.

                          On appellera le premier theta et le deuxième phi.


                          Si tu as 3 points (ou 2 vecteurs) dans un espaces à 2 ou 3 dimensions (surment N dimensions même), il y a un seul angles, pas 2 (du moins pas usuellement).



                          Oui, j'ai posté un autre topic ( [Irrlicht] Inclinaison d'un terrain) ou en gros je cherchais comment connaitre l'angle formé par l'inclinaison d'une pente. Donc dans ce cas le 3ème point n'est pas visible
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 juin 2010 à 0:53:18

                            Oui, je sais.
                            Je ne pensais pas que tu voulais l'angle entre deux vecteurs car cela change tout :) .
                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 juin 2010 à 1:07:09

                              Bon c'est super embêtant car du coup mon sujet est HS... Savez vous si il y a un moyen d'enlever ce sujet ou de changer son titre ? Ce que je veux savoir et je pense vous l'avez clairement compris, c'est l'angle entre deux vecteurs (vecteur avec une approche géométrique et non algébrique bien sur) dans un espace en 3D
                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 juin 2010 à 1:10:42

                                Citation : mr.xyz

                                (vecteur avec une approche géométrique et non algébrique bien sur)


                                Approche totalement relié et je t'ai donné la formule (et Fvirtman aussi), d'après ton dessin tu te places par rapport au point A, c'est donc les vecteur AA' et AB.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                                  29 juin 2010 à 1:11:45

                                  Citation : Fvirtman

                                  considère les vecteurs AB et AC.

                                  Le produit scalaire AB.AC = ||AB||*||AC||*cos(A)
                                  ce que tu cherches, c'est donc A, qui sera :

                                  A = acos(AB.AC/(||AB||*||AC||))

                                  AB.AC = ABx*ACx + ABy*ACy + ABz*ACz
                                  ||AB|| = sqrt(ABx²+ABy²+ABz²)
                                  ||AC|| = sqrt(ACx²+ACy²+ACz²)

                                  L'angle A sera exprimé en Radians.



                                  Où est le problème ?

                                  Pour changer le titre, il suffit d'éditer le premier message je crois bien.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
                                    29 juin 2010 à 1:16:16

                                    Non ya pas de problème je m'y mets ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 juin 2010 à 1:26:02

                                      Citation : mr.xyz

                                      Mais ca reste une approche géométrique


                                      Chacun son point de vue, personnelement j'y vois de l'algèbre, j'ai plus de connaisance général dans ce domaine donc ca m'arrange.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                                        29 juin 2010 à 1:27:22

                                        Oui oui j'ai édité car c'est vrai que sa reste une question de point de vue ^^

                                        D'un point de vue optimisation maintenant, sa ne serait pas mieux de calculer la norme du vecteur AB et d'utiliser atan2 (arctangente) ? :

                                        // Calcul de l'angle
                                        
                                            float angle;
                                            float relativX,relativZ;
                                        
                                            relativX = B.X - A.X;
                                            relativZ = B.Z - A.Z;
                                        
                                            angle = atan2(relativZ,relativX)/(M_PI/180);
                                        
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          29 juin 2010 à 2:14:25

                                          Je vois 2 points ou bien un vecteur contenu dans un plan parallèle au plan Ozx. Difficile encore une fois de dire si oui ou non c'est valide sans plus d'information.

                                          Si le vecteur AB est contenu dans un plan Ozx et si l'on souhaites calculer l'angle entre ce vecteur et le plan Oxy, alors oui c'est juste. Bref encore une fois, si on savait exactement ce que tu cherchais à faire ça serait plus simple de te donner directement LA bonne solution.

                                          Citation

                                          D'un point de vue optimisation maintenant, sa ne serait pas mieux de calculer la norme du vecteur AB et d'utiliser atan2 (arctangente) ?


                                          Tu ne calcules pas de norme ici et on n'a pas besoin de norme pour utiliser atan.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
                                            29 juin 2010 à 2:25:20

                                            Citation : iNaKoll


                                            Je vois 2 points ou bien un vecteur contenu dans un plan parallèle au plan Ozx. Difficile encore une fois de dire si oui ou non c'est valide sans plus d'information.

                                            Si le vecteur AB est contenu dans un plan Ozx et si l'on souhaites calculer l'angle entre ce vecteur et le plan Oxy, alors oui c'est juste. Bref encore une fois, si on savait exactement ce que tu cherchais à faire ça serait plus simple de te donner directement LA bonne solution.



                                            C'est à peu près ça !

                                            Premier point de vue : j'ai deux points OU un vecteur dans un plan 2D, je cherche l'angle entre ce vecteur et l'axe 0x.

                                            Deuxième point de vue : j'ai trois points (un appartenant à l'axe 0x) OU deux vecteurs et l'un des deux EST l'axe 0x.

                                            Citation : iNaKoll


                                            Citation
                                            D'un point de vue optimisation maintenant, sa ne serait pas mieux de calculer la norme du vecteur AB et d'utiliser atan2 (arctangente) ?

                                            Tu ne calcules pas de norme ici et on n'a pas besoin de norme pour utiliser atan.



                                            Oups en effet :-° je calcule la position relative ^^
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              29 juin 2010 à 9:49:44

                                              Citation : iNaKoll

                                              On est sur le site du zéro ou on ne l'est pas ! :p


                                              Justement, à ce propos, vous savez qu'il y a une balise “math” pour insérer du <math>\(\LaTeX\)</math>, ici ? :)

                                              Le message de Fvirtman devient :

                                              Citation : Fvirtman

                                              Le produit scalaire <math>\(\overrightarrow{AB}\cdot\overrightarrow{AC} = ||\overrightarrow{AB}||\times||\overrightarrow{AC}||\times\cos a\)</math>

                                              ce que tu cherches, c'est donc <math>\(a\)</math>, qui sera :

                                              <math>\(a = \arccos\left(\frac{\overrightarrow{AB}\cdot\overrightarrow{AC}}{||\overrightarrow{AB}||\times||\overrightarrow{AC}||}\right)\)</math>

                                              <math>\(\overrightarrow{AB}\cdot\overrightarrow{AC} = AB_x\times AC_x + AB_y\times AC_y + AB_z\times AC_z\)</math>
                                              <math>\(||\overrightarrow{AB}|| = \sqrt{{AB_x}^2+{AB_y}^2+{AB_z}^2}\)</math>
                                              <math>\(||\overrightarrow{AC}|| = \sqrt{{AC_x}^2+{AC_y}^2+{AC_z}^2}\)</math>

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                29 juin 2010 à 10:07:10

                                                Oui, je connais la balise Latex, mais hier soir je n'avais pas le temps :)
                                                J'en met plein dans mes tutos (surtout celui des collisions), cf ma signature
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                                [Maths/Espace 3D] Calculer l'angle entre 2 vecteurs

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown