15 votes

trouver les angles 0-360

J'ai besoin d'aide pour une question de mathématiques : Je dois obtenir l'angle réel à partir de 0 degré en utilisant les coordonnées x et y. J'utilise ceci pour le moment :

Math.atan((x2-x1)/(y1-y2))/(Math.PI/180)

mais /(Math.PI/180) limite les résultats de -90 à 90 j'ai besoin de 0-360

note : J'utilise l'angle pour indiquer la direction :

  • 0=haut
  • 90=Droit
  • 135=45 degrés droite+bas
  • 180=down
  • 270=gauche
  • etc.

38voto

jk. Points 8019

La fonction atan ne donne que la moitié du cercle unitaire entre -pi/2 et +pi/2 (0 sur l'axe des x), il existe une autre fonction de la bibliothèque qui peut donner le cercle unitaire entier entre -pi et + pi, atan2

Je pense que vous feriez mieux d'utiliser atan2 pour obtenir le bon quadrant plutôt que de vous brancher vous-même, puis de mettre à l'échelle comme vous l'avez fait, quelque chose comme

Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI + 180

La multiplication par 180 sur pi est juste l'échelle de radians en degrés comme dans la question (mais avec la division par une division simplifiée), le +180 assure que c'est toujours positif, c'est-à-dire 0-360 degrés plutôt que -180 à 180 degrés.

16voto

jilles de wit Points 5207

Math.atan vous limite aux deux quadrants les plus à droite du cercle des unités. Pour obtenir la totalité des 0-360 degrés :

if x < 0 add 180 to the angle
else if y < 0 add 360 to the angle. 

Votre système de coordonnées est tourné et inversé par rapport au mien (et par rapport à la convention). x positif est à droite, y positif est en haut. 0 degré est à droite (x>0, y=0, 90 degrés est en haut (x=0,y>0) 135 degrés est en haut et à gauche (y>0, x=-y), etc. Où pointent vos axes x et y ?

4voto

Macovei Vlad Points 11

Les réponses de @jilles de wit et @jk. m'ont conduit sur le bon chemin mais pour une raison quelconque n'ont pas fourni la bonne solution à mon problème qui, je pense, est très similaire à la question originale.

Je voulais obtenir : haut = 0°, droite = 90°, bas = 180°, gauche = 270° comme dans les systèmes de navigation aéronautique.

En supposant que la question faisait référence au dessin sur toile, j'ai trouvé cette solution :

J'ai d'abord traduit l'origine du canevas en utilisant ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2) . J'ai également divisé par deux e.offsetX et e.offsedY que j'ai obtenus à partir d'un événement souris sur le canevas pour obtenir x et y avec le même système de coordonnées que le canevas.

let radianAngle = Math.atan2(y, x);    // x has the range [-canvas.width/2 ... +canvas.width/2], y is similar
let northUpAngle = radianAngle * 180 / PI + 90;    // convert to degrees and add 90 to shift the angle counterclockwise from it's default "left" = 0°
if (x < 0 && y < 0) {    // check for the top left quadrant
    northUpAngle += 360;    // add 360 to convert the range of the quadrant from [-90...0] to [270...360] (actual ranges may vary due to the way atan2 handles quadrant boundaries)
}
northUpAngle.toFixed(2)    // to avoid getting 360° near the "up" position

Il existe peut-être une solution plus concise utilisant l'opération modulo, mais je ne l'ai pas trouvée.

2voto

Paul Lammertsma Points 12817

A noter également :

if (y1==y2) {
    if (x1>x2)
        angle = 90;
    else if (x1<x2)
        angle = 270;
    else
        angle = 0;
}

1voto

Toon Krijthe Points 36327

Cela devrait faire l'affaire :

  1. Si y2
  2. Si < 0, ajouter 360.

Exemples :

(x1,y1) = 0

(x2,y2) = (-1,1), atan() = -45, [add 360], 270
(x2,y2) = (1,1), atan() = 45
(x2,y2) = (1,-1), atan() = -45, [add 180], 135
(x2 ,y2) = (-1,-1), atan() = 45, [add 180], 225

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X