derivada atan arctan c++ math.h

c++ - arctan - formula atan2



¿Cuál es la diferencia entre atan y atan2 en C++? (10)

¿Cuál es la diferencia entre atan y atan2 en C ++?


Con atan2 puede determinar el cuadrante como se indica here .

Puede usar atan2 si necesita determinar el cuadrante.


Considera un triángulo en ángulo recto. Etiquetamos la hipotenusa r, el lado horizontal yy el lado vertical x. El ángulo de interés @ es el ángulo entre x y r.

c ++ atan2 (y, x) nos dará el valor de angle @ en radianes. atan se usa si solo conocemos o estamos interesados ​​en y / x not y y x individualmente. Entonces, si p = y / x entonces para obtener @, usaríamos atan (p).

No puedes usar atan2 para determinar el cuadrante, ¡puedes usar atan2 solo si ya sabes en qué cuadrante estás! En particular, x e y positivas implican el primer cuadrante, positivo y negativo x, el segundo y así sucesivamente. atan o atan2 simplemente devuelven un número positivo o negativo, nada más.


De las matemáticas de la escuela sabemos que la tangente tiene la definición

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

y diferenciamos entre cuatro cuadrantes según el ángulo que proporcionamos a las funciones. El signo del sin , cos y tan tiene la siguiente relación (donde descuidamos los múltiplos exactos de π/2 ):

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

Dado que el valor de tan(α) es positivo, no podemos distinguir, si el ángulo fue del primer o tercer cuadrante y si es negativo, podría provenir del segundo o cuarto cuadrante. Entonces, por convención, atan() devuelve un ángulo del primer o cuarto cuadrante (es decir, -π/2 <= atan() <= π/2 ), independientemente de la entrada original a la tangente.

Para recuperar la información completa, no debemos usar el resultado de la división sin(α) / cos(α) pero tenemos que mirar los valores del seno y el coseno por separado. Y esto es lo que atan2() hace. Toma ambos, el sin(α) y el cos(α) y resuelve los cuatro cuadrantes sumando π al resultado de atan() siempre que el coseno sea negativo.

Observación: La función atan2(y, x) realmente toma un argumento y un argumento x , que es la proyección de un vector con longitud v y ángulo α en los ejes yy x, es decir,

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

que da la relación

y/x = tan(α)

Conclusión: atan(y/x) se atan(y/x) cierta información y solo puede suponer que la entrada provino de los cuadrantes I o IV. Por el contrario, atan2(y,x) obtiene todos los datos y, por lo tanto, puede resolver el ángulo correcto.


Los valores reales están en radianes pero para interpretarlos en grados será:

  • atan = da un valor de ángulo entre -90 y 90
  • atan2 = da un valor de ángulo entre -180 y 180

Para mi trabajo, que implica el cálculo de varios ángulos, como rumbo y rumbo en la navegación, atan2 en la mayoría de los casos hace el trabajo.


Mehrwolf a continuación es correcto, pero aquí hay una heurística que puede ayudar:

Si está trabajando en un sistema de coordenadas bidimensionales, que a menudo es el caso para programar la tangente inversa, debería usar definitivamente atan2. Proporcionará el rango completo de 2 pi de ángulos y se ocupará de los ceros en la coordenada x por usted.

Otra forma de decir esto es que atan (y / x) es virtualmente siempre incorrecto. Solo use atan si el argumento no puede considerarse como y / x.


Otra cosa para mencionar es que atan2 es más estable cuando se calculan tangentes usando una expresión como atan(y / x) x es 0 o cerca de 0.


Supongo que la pregunta principal intenta averiguar: "¿cuándo debería usar uno u otro?", O "¿qué debo usar?", O "¿Estoy usando el correcto?"

Supongo que el punto importante es que solo se pretendía alimentar valores positivos en una curva de dirección derecha-hacia arriba como para vectores de tiempo-distancia. Cero siempre está en la parte inferior izquierda, y los thigs solo pueden subir y hacia la derecha, solo que más lento o más rápido. atan no devuelve números negativos, por lo que no puede rastrear las cosas en las 4 direcciones en una pantalla simplemente agregando / restando su resultado.

atan2 está destinado a que el origen esté en el medio, y las cosas pueden ir hacia atrás o hacia abajo. Eso es lo que usarías en una representación de pantalla, porque SÍ importa en qué dirección quieres que vaya la curva. Entonces atan2 puede darte números negativos, porque su cero está en el centro, y su resultado es algo que puedes usar para rastrear cosas en 4 direcciones.


atan (x) Devuelve el valor principal de la tangente de arco de x, expresado en radianes.

atan2 (y, x) Devuelve el valor principal de la tangente de arco de y / x, expresado en radianes.

Observe que debido a la ambigüedad del signo, una función no puede determinar con certeza en qué cuadrante el ángulo cae solo por su valor de tangente (atan solo). Puede usar atan2 si necesita determinar el cuadrante.


std::atan2 permite calcular el arcotangente de los cuatro cuadrantes. std::atan solo permite calcular desde los cuadrantes 1 y 4.


atan2(y,x) generalmente se usa si quiere convertir coordenadas cartesianas a coordenadas polares. Le dará el ángulo, mientras que sqrt(x*x+y*y) o, si está disponible, hypot(y,x) le dará el tamaño.

atan(x) es simplemente el inverso de tan. En el caso molesto tienes que usar atan(y/x) porque tu sistema no proporciona atan2 , tendrías que hacer comprobaciones adicionales para los signos de x e y , y para x=0 , para obtener el correcto ángulo.

Nota: atan2(y,x) se define para todos los valores reales de y y x , excepto en el caso en que ambos argumentos son cero.