Tengo problemas para entender Math.tan()
y Math.atan()
y Math.atan2()
.
Tengo conocimientos básicos de trigonmetría, pero el uso de SIN, COS, TAN, etc. para el desarrollo de juegos es muy nuevo para mí.
Estoy leyendo algunos tutoriales y veo que mediante el uso de la tangente podemos obtener el ángulo en el que un objeto necesita ser girado en función de cuánto se enfrenta a otro objeto, por ejemplo, mi mouse. Entonces, ¿por qué todavía necesitamos usar atan o atan2?
mathematics
sutoL
fuente
fuente
Respuestas:
La fórmula tangente es esta:
tan(angle) = opposite/adjacent
Consulte este dibujo:
Donde
a
está el lado adyacente,o
es el lado opuesto ytheta
es el ángulo. Del mismo modo, seno y coseno son sin (ang) = o / hy cos (ang) = a / h, dondeh
está el lado largo: http://www.mathwords.com/s/sohcahtoa.htmMientras tanto
atan
(abreviatura de arco-tangente , también conocida como la tangente inversa ) es lo contrario detan
, así:atan(opposite/adjacent) = angle
Por lo tanto, si conoce los valores de los lados opuestos y adyacentes (por ejemplo, restando las coordenadas del objeto de las coordenadas del mouse) puede obtener el valor del ángulo con
atan
.Sin embargo, en el desarrollo del juego, puede ocurrir con bastante frecuencia que el lado adyacente sea igual a 0 (por ejemplo, la coordenada x de un vector es 0). Recordando que
tan(angle) = opposite/adjacent
el potencial de un desastroso error de división por cero debería ser claro. Por lo tanto, muchas bibliotecas ofrecen una función llamadaatan2
, que le permite especificar los parámetrosx
yy
, para evitar la división por cero y proporcionar un ángulo en el cuadrante derecho.(diagrama cortesía de gareth, por favor vote su respuesta también)
El uso de trigonometría en el desarrollo de juegos es bastante común, especialmente con vectores, pero generalmente las bibliotecas ocultan el trabajo de trigonometría para usted. Puede usar sin / cos / tan para muchas tareas que involucran manipulaciones geométricas para encontrar un valor de un triángulo. Todo lo que necesitas son 3 valores (longitudes de los lados / valores de los ángulos) para encontrar los otros valores de un triángulo rectángulo, por lo que es bastante útil.
Incluso puedes usar la naturaleza de "ciclismo" de las funciones seno y coseno para comportamientos especiales en un juego, por ejemplo, he visto que cos / sin se usa mucho para hacer que un objeto gire sobre otro.
fuente
fuente
Aquí hay una forma ligeramente diferente de pensar acerca de las funciones trigonométricas, incluyendo atan () y atan2 (), que encuentro útil (las explicaciones en términos de "opuesto / adyacente" me confunden por alguna razón).
Puede ir de un punto a otro moviendo las unidades x horizontalmente y las unidades y verticalmente (llamadas coordenadas rectangulares o cartesianas ) o moviendo la distancia r en un ángulo de Ɵ (llamadas coordenadas polares en 2D).
Digamos que tenemos una coordenada polar (r, Ɵ) y queremos convertirla a (x, y).
cos (Ɵ) te da la proporción de r que se encuentra a lo largo del eje x :
Del mismo modo, sin (Ɵ) te da la proporción de r que se encuentra a lo largo del eje y :
¿Qué tal convertir coordenadas rectangulares (x, y) en coordenadas polares (r, Ɵ)?
r es la hipotenusa del triángulo rectángulo formado por x e y , entonces:
tan (Ɵ) da la pendiente, el aumento sobre la carrera, de la línea con longitud r . Entonces:
Sin embargo, al realizar y / x, calcular 3/4 da la misma respuesta que calcular -3 / -4. Del mismo modo, -3/4 da la misma respuesta que 3 / -4. Entonces tenemos atan2 (y, x) que maneja los signos individuales correctamente y evita un error de división por cero / infinito.
fuente
Jesse y Sid están básicamente en lo cierto, pero sospecho que realmente está buscando información sobre el problema.
Se necesita Atan2 () ya que atan () no le indica el ángulo desde la horizontal que necesita, ya que no hace frente a los cuadrantes.
Esto significa que usar atan para los vectores (-2,2) y (2, -2) dará el mismo valor. Luego, debe activar el signo de sus argumentos y agregar pi al resultado. Además, tiene el caso especial de dividir por cero para considerar que Jesse mencionó. También atan2 () funciona mejor que atan cuando x está cerca de 0
Entonces, si quieres el ángulo de un vector entre -pi y pi
o
fuente
y==0
luego dividir porx
en la otra rama.Aclararé algunas cosas de manera concisa. Consulte los tutoriales de trigonometría en línea para obtener una explicación detallada.
Deja que sea un ángulo. Entonces tan (a) = tan (a + 2 * pi).
atan es tan inverso, es decir, te da el ángulo dado el bronceado. Cuando llame a atan (tan (a + 2 * pi)), la respuesta será a. Esto será inadecuado para su aplicación.
atan2 tomará 2 argumentos para ayudar a estas situaciones exactas. atan toma x e y, que son básicamente cos (a) y sin (a).
atan2 (sin (a), cos (a)) = a atan2 (sin (a + 2 * pi), cos (a + 2 * pi)) = a + 2 * pi / * sin y cos tiene diferentes signos, lo que lleva a una respuesta diferente * /
Encuentre algunos tutoriales para explicar por qué es así.
Su código debería ser algo como esto:
fuente
tan(a) = - tan(-a)
, la ecuación que querías expresar fue quizástan(a) = tan(pi+a)
Un uso
atan2
que encontré en mi código es "ángulo firmado".Normalmente, la forma en que encontraría el ángulo entre dos vectores es
Pero esto no le dice cuál "guía" (es decir, está "más adelante en sentido horario" que el otro). Esta información puede ser importante para el seguimiento de gestos.
Puede encontrar el ángulo desde el eje x
(1,0)
para ambos vectores, pero existe este desagradable problema de ambigüedad: un vector con un ángulo de 315 grados devuelve 45 grados usando elcos
método anterior, y también lo hace un ángulo de 45 grados. Podrías hacer una comprobación de signosy
para arreglar eso, o podrías usaratan2
.fuente
Tenga en cuenta que atan no está roto. arctan o tan inversa es solo una función entre -PI / 2 y PI / 2. Repite este patrón, pero no es una función que sea un problema para una computadora, ya que no maneja múltiples respuestas.
Esto es lo mismo para asin entre -PI / 2 y PI / 2 y acos entre 0 y PI. Estos son los rangos más simples para que ocurra una función. Para atan y asin va de lo más negativo a lo más positivo. Porque acos va de lo más positivo a lo más negativo. (esto ayuda a interpolar respuestas más precisas)
asin, acos y atan son las funciones matemáticas.
Sin embargo, atan2 es mucho más útil para la programación, ya que proporciona la revolución completa (PI en radianes o 360 grados o 400 gradios). Tenga en cuenta que solo produjeron uno para bronceado, no para pecado o cos. Tan es el único que usa horizontal y vertical (x, y)
fuente