javascript - switch - Cálculo de grados entre 2 puntos con eje Y inverso
random js (4)
Estoy creando un juego 2D simple en javascript / canvas. Necesito averiguar el ángulo de un determinado objeto en relación con mi posición.
Entonces, digamos que estoy en (10,10) y el objeto está en (10,5), lo que daría como resultado 90 grados (ya que la Y positiva está abajo, la Y negativa está arriba) (10,10) vs (10, 15) sería de 270 grados.
¿Cómo voy a hacer esto?
En el lienzo HTML5, el origen es la esquina superior izquierda, por lo que el eje y crece de arriba a abajo. Entonces, independientemente de donde sea que se encuentre en el círculo unitario para calcular el ángulo del punto A al centro (C), debería hacer lo siguiente:
angle = Math.atan2(Cy-Ay,Ax-Cx)
y obtendrá su resultado en el rango de [-π, π].
No tengo idea de por qué no han hecho el origen del lienzo en la esquina inferior izquierda.
En términos sencillos:
function pointDirection(x1, y1, x2, y2) {
return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}
Si tus coordenadas son (xMe, yMe) y sus coordenadas son (xThem, yThem), entonces puedes usar la fórmula:
arctan((yMe-yThem)/(xThem-xMe))
Normalmente sería arctan((yThem-yMe)/(xThem-xMe))
, pero en este caso el signo del eje y se invierte.
Para convertir el resultado de radianes a grados, multiplique por 180 / pi.
Así que en JavaScript, esto se vería como: Math.atan((yThem-yMe)/(xThem-xMe))*180/Math.PI
atan da un valor entre -pi / 2 y pi / 2 (es decir, entre -90 y 90 grados). Pero puede ver en qué cuadrante se encuentra su vector (xThem - xMe, yMe - yThem) y ajustar según corresponda.
Supongamos que estás en (a, b) y el objeto está en (c, d). Entonces la posición relativa del objeto para usted es (x, y) = (c - a, d - b).
Entonces podrías usar la función Math.atan2()
para obtener el ángulo en radianes.
var theta = Math.atan2(-y, x);
tenga en cuenta que el resultado está en el rango [-π, π]. Si necesita números no negativos, tiene que agregar
if (theta < 0)
theta += 2 * Math.PI;
y convertir radianes a grados, multiplicar por 180 / Math.PI