Cálculo de grados entre 2 puntos con eje Y inverso


Estoy creando un simple juego 2D 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) - eso resultaría en 90 grados (como positivo Y es abajo, negativo Y es arriba) (10,10) vs (10,15) sería 270 grados.

¿Cómo lo haría?

Author: skerit, 2010-07-22

4 answers

Supongamos que estás en (a, b) y el objeto está en (c, d). Entonces la posición relativa del objeto es (x, y) = (c-a, d-b).

Entonces usted podría utilizar el Math.atan2() función 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, debe agregar

if (theta < 0)
   theta += 2 * Math.PI;

Y convertir radianes a grados, multiplicar por 180 / Math.PI.

 37
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-22 14:01:17

Si sus coordenadas son (xMe, yMe) y sus coordenadas son (xThem, yThem), entonces puede 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 usted puede mirar qué cuadrante su (xThem-xMe, yMe-yThem) vector está en y ajustar en consecuencia.

 6
Author: Tim Goodman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-22 14:15:01

En términos sencillos:

function pointDirection(x1, y1, x2, y2) {
    return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}
 4
Author: Petah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-23 08:10:16

En el lienzo HTML5, el origen es la esquina superior izquierda, por lo que el eje y crece de arriba a abajo. Por lo tanto, independientemente de dónde se encuentre en el círculo unitario para calcular el ángulo del punto A al centro(C), de hecho, debe hacer como

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.

 1
Author: Redu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-27 15:22:53