2017-02-25 5 views
-3

J'essaie de mesurer l'angle entre deux points par rapport à l'axe X, en degrés.Math.Atan2 donne une valeur incorrecte lors de la conversion en degrés

De la recherche à d'autres messages sur un débordement de pile, je l'ai utilisé le code suivant:

private double GetAngleBetweenTwoPoints(double x1, double y1, double x2, double y2) 
{ 
    return Math.Atan2(y2 - y1, x2 - x1) * 180.0/Math.PI; 
} 

Le problème est, cela semble fonctionner très bien pour certaines valeurs, mais pas d'autres. Par exemple, passer (0, 0, 1, 1) renvoie correctement la valeur 45. Cependant, passer (0, 0, 2, 1) renvoie 26.565051177078 alors que j'attendrais 22.5.

Qu'est-ce que je fais mal?

+1

Rien ne va pas. C'est correct, vous vous attendez juste mal – Li357

+0

oui, je comprends mieux maintenant. Merci –

Répondre

2

La tangente inverse de 0,5 est de 26,565 degrés, et non de 22,5 degrés.

Vous pouvez le voir en prenant la tangente de 26,565 degrés, ce qui donne un nombre très proche de 0,5, alors que la tangente de 22,5 degrés est d'environ 0,414.

(NB comme tangente est cyclique, il existe un nombre infini d'autres valeurs x pour lesquels tan x est de 0,5, mais qui ne sont pas pertinents pour cette question.)

+0

Merci. J'avais le sentiment que je ne pensais pas correctement au problème. Le fait que ce soit si proche de la bissectrice de 45 degrés m'a fait faire une mauvaise supposition. –

0

La ligne de demi-angle pour l'angle (1,1) est la bissectrice qui passe par le point milieu (1,1) et (sqrt(2),0) qui sont toutes les deux sur le cercle de rayon sqrt(2). Ainsi, vous recherchez le point (0.5+\sqrt(0.5), 0.5) pour l'angle 22.5°.