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

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

Le problème exposé dans ce sujet a été résolu.

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.

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.

: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.

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
+0 -0

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.

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
+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.

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);
+0 -0

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.

Je ne comprends pas ce qu’est cette orientationNSWE, c’est une valeur à toi ? Tu la décris comme un ensemble de quatre nombres, mais la manière dont tu l’utilises laisse penser que c’est un seul nombre, donc je suis perdu.

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.

Ça fonctionne correctement maintenant avec mes derniers changements, mon soucis était que le résultat n’était pas optimisé avec cette fameuse condition pour la conversion.

orientationNSWE m’est donné, je ne peux pas modifier la valeur en entrée, à moins de faire la conversion sur elle mais ça déplacerait le problème ailleurs.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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