2008-11-12 38 views

Respuesta

78

std::atan2 permite calcular el arcotangente de los cuatro cuadrantes. std::atan solo permite calcular, si no recuerdo mal, los cuadrantes 1 y 4.

3

Con atan2 puede determinar el cuadrante como se indica here.

Puede utilizar atan2 si necesita determinar el cuadrante.

8

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 tangente (atan solo). Puede usar atan2 si necesita determinar el cuadrante.

+2

atan2 (x, y) -> atan2 (y, x) – yesraaj

+0

El rango de valores principales es '(-pi, pi]' pero atan2 tiene el rango '[-pi, pi]' por lo que incluye uno valor '-pi' de otra rama debido a' atan2 (-0.0, x) 'para' x <0'. –

17

Otra cosa a mencionar es que atan2 es más estable cuando se calcula tangentes utilizando una expresión como atan (y/x) y x es 0 o cercano a 0.

+0

Interesante, ¿tiene una fuente para esto? ¿Es esto cierto en general o solo para C++? – Gerard

+1

Compruebe http : //en.wikipedia.org/wiki/Atan2 Consulte la parte de historia y motivación – Laserallan

2

Considere un triángulo rectángulo. 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 @ usaremos atan (p).

No puede usar atan2 para determinar el cuadrante, puede usar atan2 solo si ya sabe cuál cuadrante está adentro! 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.

+3

Si todo lo que tiene es 'p = y/x', puede utilizar' atan2 (p, 1) '. –

228

De la matemática escolar, sabemos que la tangente tiene la definición

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

y diferenciar entre los cuatro cuadrantes basados ​​en el ángulo que suministramos a las funciones. El signo de la sin, cos y tan tiene la siguiente relación (donde descuidamos múltiplo exacto de π/2):

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

Teniendo en cuenta que el valor de tan(α) es positiva, no podemos distinguir, si el ángulo era de la primer o tercer cuadrante y si es negativo, podría provenir del segundo o cuarto cuadrante. Por lo tanto, 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 volver a obtener la información completa, no debemos usar el resultado de la división sin(α)/cos(α), pero tenemos que mirar los valores de seno y coseno por separado. Y esto es lo que hace atan2().Toma ambos, el sin(α) y cos(α) y resuelve los cuatro cuadrantes al agregar π al resultado de atan() siempre que el coseno sea negativo.

Observación: La función atan2(y, x) realmente tiene una y un argumento yx, que es la proyección de un vector con una longitud de v y el ángulo α en la Y y el eje x, es decir,

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

que da la relación

y/x = tan(α) 

Conclusión: atan(y/x) se retiene 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.

+1

Un pequeño detalle, el rango '-π/2 <= atan() <= π/2' en realidad incluye un punto (' pi/2') del cuadrante II. –

2

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

Supongo que el punto importante es que solo estaba destinado 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.

15

Los valores reales son en radianes pero interpretarlos en grados que será:

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

Por mi trabajo que implica el cálculo de varios ángulos de descabezado y teniendo en navegación, atan2 en la mayoría de los casos se encarga del trabajo.

0

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

Si está trabajando en un sistema de coordenadas de 2 dimensiones, que es a menudo el caso para la programación de la tangente inversa, se debe utilizar utilizar 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.

0

atan2(y,x) se usa generalmente 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, deberías hacer comprobaciones adicionales para los signos de x y y, y para x=0, para obtener el ángulo correcto.

Nota:atan2(y,x) está definida para todos los valores reales de y y x, excepto para el caso en que ambos argumentos son iguales a cero.

Cuestiones relacionadas