184 votes

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

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

358voto

Mehrwolf Points 2997

Depuis l'école de mathématiques, nous savons que la tangente a pour définition

tan() = sin() / cos()

et nous distinguons quatre quadrants en fonction de l'angle que nous fournissons aux fonctions. Le signe de l'angle sin , cos et tan ont 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 positif, 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. Donc, par convention, atan() renvoie un angle du premier ou du quatrième quadrant (c.-à-d. -/2 <= atan() <= /2 ), quelle que soit l'entrée initiale de la tangente.

Afin de récupérer l'information complète, 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 atan2() fait. Il faut les deux, le sin() et cos() et résout les quatre quadrants en ajoutant au résultat de atan() quand le cosinus est négatif.

Remarques : Le site atan2(y, x) prend en fait un y et un x qui est la projection d'un vecteur de longueur v et l'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 ne peut que supposer que l'entrée provient des quadrants I ou IV. En revanche, atan2(y,x) reçoit toutes les données et peut donc résoudre l'angle correct.

6 votes

Un petit détail, la gamme -/2 <= atan() <= /2 comprend en fait un point ( pi/2 ) du quadrant II.

0 votes

Brillant, merci

153voto

Chris Jester-Young Points 102876

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

32voto

Keugyeol Points 1108

Les valeurs réelles sont en radians mais pour les interpréter en degrés ce sera :

  • 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 tels que le cap et le relèvement dans la navigation, atan2 dans la plupart des cas, fait l'affaire.

29voto

Laserallan Points 5500

Une autre chose à mentionner est que atan2 est plus stable lorsque l'on calcule les tangentes en utilisant une expression telle que atan(y / x) et 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 seulement pour le C++ ?

14voto

Roman M Points 912

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

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

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

0 votes

La gamme des valeurs de principe est la suivante (-pi,pi] mais atan2 a l'étendue [-pi,pi] il comprend donc 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