2010-07-22 7 views
26

Estoy creando un juego 2D simple en javascript/canvas. Necesito averiguar el ángulo de un determinado objeto en relación con mi posición.Cálculo de grados entre 2 puntos con el eje Y inverso

Entonces, digo que estoy en (10,10) y el objeto está en (10,5) - eso daría como resultado 90 grados (como Y positivo está abajo, Y negativo está arriba) (10,10) vs (10,15) sería 270 grados.

¿Cómo podría hacerlo?

+0

Ángulo visto desde dónde? –

+0

Estoy confundido en cuanto a cómo estás determinando el ángulo ... ¿estás mirando en cierta dirección todo el tiempo? – rownage

+0

@rownage: a menos que haya entendido mal, el punto es determinar la orientación del vector que apunta de una posición a la otra. –

Respuesta

37

Supongamos que está 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).

Luego puede usar Math.atan2() function 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, hay que añadir

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

y convertir radianes a grados, se multiplica por 180/Math.PI.

6

Si sus coordenadas son (XME, yme) y sus coordenadas son (xThem, yThem), entonces se puede utilizar 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 está invertido.

Para convertir el resultado de radianes a grados multiplicar por 180/pi.

Así que en JavaScript, esto se vería así: 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 puedes ver en qué cuadrante está tu vector (xThem - xMe, yMe - yThem) y ajustarlo en consecuencia.

+2

Me gusta más la respuesta de KennyTM. Math.atan2 sabrá en qué cuadrante ya te encuentras, así que te salvaste el último paso. –

+0

Aún encuentro útil esta respuesta, es una buena alternativa porque quiero controlar los cuadrantes por mi cuenta. – Partack

4

En términos sencillos:

function pointDirection(x1, y1, x2, y2) { 
    return Math.atan2(y2 - y1, x2 - x1) * 180/Math.PI; 
} 
1

En HTML5 Canvas es el origen de la esquina superior izquierda de ahí el eje y crece de arriba a abajo. Así que, independientemente de donde se encuentre en el círculo unitario para calcular el ángulo del punto A al centro (C) se debe, de hecho, hacer como

angle = Math.atan2(Cy-Ay,Ax-Cx)

y obtendrá el resultado en el rango de [- π, π].

No tengo idea de por qué no han hecho que el origen del lienzo sea la esquina inferior izquierda.

Cuestiones relacionadas