true switch for elsif con javascript math trigonometry degrees

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