221 votes

Quelle est la différence entre atan et atan2 en C++ ?

Quelle est la différence entre atan et atan2 en C++?

407voto

Mehrwolf Points 2997

De l'enseignement des mathématiques à l'école, nous savons que la tangente a pour définition

tan(α) = sin(α) / cos(α)

et nous différencions entre quatre quadrants en fonction de l'angle que nous fournissons aux fonctions. Le signe du sin, du cos et de la tan a la relation suivante (où nous négligeons les multiples exacts de π/2) :

  Quadrant    Angle              sin   cos   tan
-------------------------------------------------
  I           0    < α < π/2      +     +     +
  II          π/2  < α < π        +     -     -
  III         π    < α < 3π/2     -     -     +
  IV          3π/2 < α < 2π       -     +     -

Étant donné que la valeur de tan(α) est positive, nous ne pouvons pas distinguer si l'angle provient du premier ou du troisième quadrant et s'il est négatif, il pourrait provenir du deuxième ou du quatrième quadrant. Ainsi, par convention, atan() renvoie un angle du premier ou du quatrième quadrant (c'est-à-dire -π/2 <= atan() <= π/2), indépendamment de l'entrée originale à la tangente.

Pour récupérer toutes les informations, nous ne devons pas utiliser le résultat de la division sin(α) / cos(α) mais nous devons regarder les valeurs du sinus et du cosinus séparément. Et c'est ce que fait atan2(). Il prend à la fois le sin(α) et le cos(α) et résout les quatre quadrants en ajoutant π au résultat de atan() chaque fois que le cosinus est négatif.

Remarque : La fonction atan2(y, x) prend en fait un argument y et un argument x, qui est la projection d'un vecteur de longueur v et d'angle α sur les axes y et x, c'est-à-dire

y = v * sin(α)
x = v * cos(α)

ce qui donne la relation

y/x = tan(α)

Conclusion : atan(y/x) retient certaines informations et on ne peut que supposer que l'entrée provenait des quadrants I ou IV. En revanche, atan2(y, x) obtient toutes les données et peut ainsi résoudre l'angle correctement.

8 votes

Un petit détail, la plage -/2 <= atan() <= /2 inclut en réalité un point (pi/2) du deuxième quadrant.

0 votes

Brillant, Merci

168voto

Chris Jester-Young Points 102876

std::atan2 permet de calculer l'arctangente des quatre quadrants. std::atan permet de calculer seulement des quadrants 1 et 4.

46voto

Keugyeol Points 1108

Les valeurs réelles sont en radians mais pour les interpréter en degrés, cela donnera :

  • atan = donne une valeur d'angle entre -90 et 90
  • atan2 = donne une valeur d'angle entre -180 et 180

Pour mon travail qui implique le calcul de divers angles comme le cap et le relèvement en navigation, atan2 dans la plupart des cas fait l'affaire.

1 votes

La réponse la plus intuitive ici.

32voto

Laserallan Points 5500

Une autre chose à mentionner est que atan2 est plus stable lors du calcul des tangentes en utilisant une expression comme atan(y / x) et que x est égal à 0 ou proche de 0.

0 votes

Intéressant, avez-vous une source pour cela? Est-ce vrai en général ou juste pour C++?

16voto

Roman M Points 912

Atan(x) Retourne la valeur principale de l'arc tangente de x, exprimée en radians.

atan2(y,x) Retourne la valeur principale de l'arc tangente de y/x, exprimée en radians.

Remarque que en raison de l'ambiguïté des signes, une fonction ne peut pas déterminer avec certitude dans quel quadrant l'angle tombe seulement par sa valeur de tangente (atan seul). Vous pouvez utiliser atan2 si vous avez besoin de déterminer le quadrant.

0 votes

La plage des valeurs principale est (-pi,pi] mais atan2 a la plage [-pi,pi] donc il inclut une valeur supplémentaire -pi d'une autre branche en raison de atan2(-0.0,x) pour x<0.

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