Pregunta

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

¿Fue útil?

Solución

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

Otros consejos

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

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

y podemos diferenciar entre cuatro cuadrantes en función del ángulo que suministramos a las funciones.El signo de la sin, cos y tan tiene la siguiente relación (donde, el abandono de 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 desde el primer o tercer cuadrante y si es negativa, podría venir desde el segundo o cuarto cuadrante.Por convención, atan() devuelve un ángulo desde el primer o cuarto cuadrante (es decir, -π/2 <= atan() <= π/2), independientemente de la entrada original a la tangente.

Con el fin de recuperar la totalidad de la información, no debemos utilizar el resultado de la división sin(α) / cos(α) pero tenemos que mirar a los valores del seno y coseno por separado.Y esto es lo que atan2() no.Se tarda tanto, la sin(α) y cos(α) y resuelve todos los cuatro cuadrantes mediante la adición de π para el resultado de atan() cada vez que el coseno es negativo.

Comentario: El atan2(y, x) la función de realidad, se toma una y y un x el argumento, que es la proyección de un vector con longitud de v y el ángulo α en el eje 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 celebra de nuevo algunos datos y sólo puede suponer que la entrada de vino de los cuadrantes I y IV.En contraste, atan2(y,x) obtiene todos los datos y por lo tanto puede resolver el ángulo correcto.

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

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 el rumbo y la orientación en la navegación, <=> en la mayoría de los casos hace el trabajo.

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

atan2 (y, x) Devuelve el valor principal del arco tangente 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 (solo atan). Puede usar atan2 si necesita determinar el cuadrante.

Supongo que la pregunta principal trata de averiguar: " ¿cuándo debo usar uno u otro " ;, o " que debo usar " ;, o < !> quot; ¿Estoy usando la correcta " ;?

Supongo que el punto importante es que atan solo estaba destinado a alimentar valores positivos en una curva de dirección hacia arriba a la derecha, como para los vectores de tiempo-distancia. Cero siempre está en la parte inferior izquierda, y los thigs solo pueden subir y bajar, solo más lento o más rápido. atan no devuelve números negativos, por lo que no puede rastrear cosas en las 4 direcciones en una pantalla simplemente sumando / 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ía en una representación de pantalla, porque NO importa en qué dirección desea 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.

Con atan2 puede determinar el cuadrante como se indica aquí .

  

Puede usar atan2 si necesita   determinar el cuadrante.

Considere la posibilidad de un ángulo recto del triángulo.La etiqueta de la hipotenusa r, el lado horizontal y la vertical de lado x.El ángulo de interés @ es el ángulo entre x y r.

c++ atan2(y, x), nos dará el valor del ángulo @ en radianes.atan se utiliza, si sólo sabemos o está interesado en y/x n y x de forma individual.Así que si p = y/x entonces para conseguir la @ tendríamos que usar atan(p).

Usted puede utilizar atan2 para determinar el cuadrante, puede utilizar atan2 sólo si ya sabes que en el cuadrante de su en!En particular positivos x e y se implica en el primer cuadrante, y positivo y negativo de x, la segunda y así sucesivamente.atan o atan2 ellos, simplemente devolver un positivo o un número negativo, nada más.

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

Si está trabajando en un sistema de coordenadas bidimensional, que suele ser el caso para programar la tangente inversa, definitivamente debe usar atan2. Le dará el rango completo de ángulos de 2 pi y se encargará de los ceros en la coordenada x para usted.

Otra forma de decir esto es que atan (y / x) está prácticamente siempre equivocado. Solo use atan si el argumento no puede considerarse como y / x.

atan2(y,x) se utiliza generalmente si usted desea convertir coordenadas cartesianas a coordenadas polares.Se 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 la inversa de bronceado.En el molestos caso de tener que utilizar atan(y/x) debido a que el sistema no proporciona atan2, lo que tendría que hacer comprobaciones adicionales para los signos de x y y, y para x=0, con el fin de obtener el ángulo correcto.

Nota: atan2(y,x) está definida para todos los valores reales de y y x, excepto para el caso cuando los dos argumentos son cero.

En atan2, el resultado es: -pi < atan2(y,x) <pi
y en la atan, el resultado es: -pi/2 < atan(y/x) < pi/2 //esta dosis NO considerar el trimestre.
Si usted desea conseguir la orientación entre 0 y 2*pi (como la alta escuela de matemáticas), necesitamos utilizar el atan2 y para valores negativos agregar el 2*pi para obtener el resultado final entre 0 y 2*pi.
Aquí está el código fuente de Java para explicar claramente:

System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter

System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter

System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter

System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top