Connaître l'angle par rapport au premier point du vecteur

EPISODE 2 : Le problème d'être un avion c'est ça !

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Grâce à mon autre sujet, je sais si l’OVNI est à ma gauche ou à ma droite. Maintenant je souhaite pouvoir cadrer la photo correctement, je dois donc connaitre l’angle de l’OVNI avec moi (point A-312. :lol: C’est logique, je suis le point A! ) (donc l’angle AOB\stackrel \frown \text{AOB}).

Comment dois-je procéder pour connaître l’angle AOB\stackrel \frown \text{AOB} ?


Ma supposition :

Je pense que je dois utiliser Pythagore, une fois que je connais le côté adjacent de AOB\stackrel \frown \text{AOB}.

Il me semble que je dois prolonger AO\vec{AO} et placer le point OO^\prime de sorte à former le triangle rectangle AOBAO^{\prime}B.

Je ne sais pas comment obtenir la position de OO^\prime.

Bon vol,

A.

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Dans ton autre sujet on évoquait le produit scalaire et le produit vectoriel (ou le déterminant). L’un est fonction des normes des vecteur et du cosinus de l’angle, l’autre des normes et du sinus. Donc tu as tout ce qu’il te faut pour retrouver l’angle.

Auteur du sujet

le produit vectoriel (ou le déterminant)

:o Je ne savais pas que c’était la même chose.


Alors sur : http://paquito.amposta.free.fr/glossp/prodscal.htm que signifie "||" ?

EDIT : Mauvais lien + Suppression de la partie, j’allais dans une mauvaise direction.

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0

Cette réponse a aidé l’auteur du sujet

:o Je ne savais pas que c’était la même chose.

A-312

Ce n’est pas la même chose, mais comme les deux vecteurs sont dans le plan ça revient au même (et c’est plus logique de parler de déterminant car aucun espace n’est défini).

Alors sur : http://paquito.amposta.free.fr/glossp/prodscal.htm que signifie "||" ?

A-312

C’est la norme du vecteur.

Auteur du sujet

J’ai improvisé un autre essai, c’est faux :(

  • A(5;1)\mathrm{A(5;1)}
  • B(1;4)\mathrm{B(1;4)}
  • Ovni(2;1)\mathrm{O_{\text{vni}}(2;1)}

Donc :

  • AB(4;3)\mathrm{\vec{AB}(-4;3)}
  • AO(3;1)\mathrm{\vec{AO}(-3;1)}

Alors :

AB.AOvni=(43).(31))=4(3)+31=15\overrightarrow{AB}\;.\;\overrightarrow{AO_{\text{vni}}} = \begin{pmatrix} -4 \\ 3 \end{pmatrix}.\begin{pmatrix} -3 \\ 1 \end{pmatrix}) = -4 * (-3) + 3 * 1 = 15

Puis :

15cos((43),(31))15 * \mathrm{cos}(\begin{pmatrix} -4 \\ 3 \end{pmatrix},\begin{pmatrix} -3 \\ 1 \end{pmatrix})
15cos(413(3))15 * \mathrm{cos}(-4 * 1 - 3 * (-3))
15cos(5)=14.9415 * \mathrm{cos}(5) = 14.94

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0

Cette réponse a aidé l’auteur du sujet

Ton calcul d'AO\vec{AO} n’est pas bon, A et O ont la même ordonnée normalement.

Pour la suite tu peux en effet déterminer le cosinus de l’angle OAB à partir du produit scalaire. Et tu peux avoir le sinus avec le déterminant. Oriente-toi alors vers la fonction atan2 qui est la meilleure manière d’obtenir l’angle à partir de ces deux valeurs.

Auteur du sujet

TAN ? Mais je n’ai pas le côté opposé

EDIT : Si avec : tan2((BxAx)/(ByAy))\text{tan2}((B_x - A_x)/(B_y - A_y))

EDIT2 : Mon précédent edit est faux. Je ne l’ai pas car il me manque un bout du côté adjacent, ma première explication était fause.


  • A(5;1)\mathrm{A(5;1)}
  • B(1;4)\mathrm{B(1;4)}
  • Ovni(2;1)\mathrm{O_{\text{vni}}(2;1)}

Donc :

  • AB(4;3)\mathrm{\vec{AB}(-4;3)}
  • AO(3;1)\mathrm{\vec{AO}(-3;1)}

Je pense avoir trouvé :

ABAOvni=ABAOcos(BAO)\overrightarrow{AB}\;*\;\overrightarrow{AO_{\text{vni}}}=\mathrm{AB}*\mathrm{AO}*\text{cos}(\stackrel \frown \text{BAO})
AB.AOvni=(43).(31))=4(3)+31=15\overrightarrow{AB}\;.\;\overrightarrow{AO_{\text{vni}}} = \begin{pmatrix} -4 \\ 3 \end{pmatrix}.\begin{pmatrix} -3 \\ 1 \end{pmatrix}) = -4 * (-3) + 3 * 1 = 15

Avec :

AB=44+33=25=5AB = \sqrt{4*4+3*3} = \sqrt{25} = 5
AO=33+11=10=3.162AO = \sqrt{3*3+1*1} = \sqrt{10} = 3.162

Donc :

15=53.2cos(BAO)15=5*3.2*\text{cos}(\stackrel \frown \text{BAO})
cos1(BAO)=15/250\mathrm{cos}^{-1}(\stackrel \frown \text{BAO}) = 15/\sqrt{250}
arccos(15/250)=18.43\mathrm{arccos}(15/\sqrt{250}) = 18.43

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+1 -0

Non la fonction atan2 de la lib math, qui prend une ordonnée et une abscisse et renvoie un angle en radians. Elle est préférable à arccos ou arcsin car comprend tout le cercle trigonométrique, là où les deux autres se limiteront à des demi-cercles.

Auteur du sujet

Si je comprends : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/atan2

Quand je fais

Math.atan2(3,3)*180/Math.PI

C’est comme si j’avais un triangle ABC : A(0;0) B(3;0) C(3;3) et il me donne l’angle de BAC ?

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0
Auteur du sujet

Avant de faire ce sujet j’utilisais Math.atan2 sans visualiser correctement que c’était un angle universelle avec mes tests je savais que c’était la fonction la plus adapté mais j’avais du mal à traiter le résultat que j’obtenais donc je me retrouvais avec un résultat final faux :

Mais en me penchant sur le sujet j’ai pu corriger grâce à cette visualisation. Merci. :)

J’ai pu réaliser la ligne 8 et 16 sachant que je comprenais vraiment le résultat d’atan2, on constate que ma solution n’est pas très mathématique :

function getAngle(a, b) {
    const x = b.x - a.x,
          y = b.y - a.y,
          dx = (x < 0) ? -1 : 1,
          dy = (y < 0) ? -1 : 1,
          atan2 = Math.atan2(Math.abs(y), Math.abs(x));
 
    let axe; // Chaque valeur de axe à +90 car sens horaire
    if (dx === 1 && dy === 1)
        axe = 90;
    else if (dx === -1 && dy === 1)
        axe = 180;
    else if (dx === -1 && dy === -1)
        axe = 270;
    else if (dx === 1 && dy === -1)
        axe = 360;
    //                   /\ dy est inversé dans les 4 conditions
    //                      pour que SUD soit égale à 90.

    return axe - Math.round(atan2 * 180 / Math.PI);
    //        /\ soustraction pour le sens horaire
}

function correction180(angle) {
    if (angle > 180) {
        return 180 - angle;
    } else if (angle < -180) {
        return 360 + angle;
    } else {
        return angle;
    }
}

correction180(orientationNSWE - getAngle(positionXY, destinationXY))

On peut gérer la ligne 8 et 16 comme ci-dessous, mais ça complexifie le code.

const axe = 90 * (1 + (dx * dy == -1) + (dy == -1) * 2);

Pour essayer dans la console web :

((dx, dy) => 90 * (1 + (dx * dy == -1) + (dy == -1) * 2))(1, -1)

EDIT : Ou :

const axe = 90 * (1 + (dx != dy) + (dy == -1) * 2);

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0
Auteur du sujet

Enfin je vois bien que tu veux convertir la valeur en degrés (est-ce réellement utile ?), mais pour le reste ?

L’entrée orientationNSWE est en degrés je suis donc obligé de faire la conversion.


getAngle(positionXY, destinationXY) me donne l’angle du vecteur (donc de mon mouvement) sous le même format que orientationNSWE : E=0°, S=90°, W=180°, N=270°.

orientationNSWE est l’angle absolu de mon regard (E=0°, S=90°, W=180°, N=270°)

En soustrayant l’angle du vecteur avec orientationNSWE, j’obtiens le delta qui représente la direction où regarder pour prendre ma photo. :Dangle=0 est le nez de l’appareil et angle=180 ou angle=-180 la queue, angle=-90 ou angle=90 le côté droit ou gauche.


Pour ma condition :

                N=270
                  |
      dx=1, dy=-1 | dx=1, dy=1
                  |
W=180-------------+-------------E=0 ou 360
                  |
     dx=-1, dy=-1 | dx=1, dy=-1
                  |
                 S=90

J’ai dû inversé dy car le nord-sud est inversé dans l’entrée orientationNSWE.

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0
Auteur du sujet

orientationNSWE est mon angle sur l’axe Nord, Sud, Ouest et Est.

Si je regarde à l’est alors angle = 0°, si je regarde au sud 90°, ouest 180° et nord 270°.

EDIT : Mon doigt a glissé, j’ai cliqué sur envoyer au lieu d’aperçu

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0

Ah, d’accord, j’avais mal lu/compris. C’est donc simplement l’angle exprimé en degré et dans le sens indirect.

Tu ne pourrais pas plutôt l’avoir dans le sens direct (donc 90° au Nord et 270 au Sud) ? Ce serait plus simple je pense. La conversion entre les deux est simple, il suffit de multiplier par -1 (modulo 360 si tu veux un résultat positif).

Mais au final je n’ai pas compris si tu étais arrivé à quelque chose de fonctionnel ou si tu avais encore des soucis.

Auteur du sujet

Ça fonctionne correctement. Mon seul soucis était que le résultat n’était pas efficient avec cette fameuse condition pour la conversion.

orientationNSWE m’est donné. A moins de faire la conversion sur elle mais ça déplacerait le problème plus haut.

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte