Necesito calcular de qué lado de un punto está otro punto y he estado buscando en Google, pero no tengo ni idea de qué significan todas esas ecuaciones matemáticas o cómo se traducen en código o JavaScript más específicamente.
Tengo la siguiente información:
Ahora, ¿cómo sé si el punto B está a la izquierda o al lado derecho del punto A? Las respuestas en JavaScript son muy apreciadas.
Considere el signo de expresión (si el angle está en grados, multiplíquelo por Math.PI/180 para obtener radianes)
cross = (Bx - Ax)*Math.sin(angle)-(By - Ay)*Math.cos(angle) Editar: para el sistema de coordenadas OX norte, en el sentido de las agujas del reloj es necesario intercambiar cos y sin
cross = (Bx - Ax)*Math.cos(angle)-(By - Ay)*Math.sin(angle)Valor positivo para el lado derecho, valor negativo para el lado izquierdo (o viceversa, dependiendo de la orientación de su sistema de coordenadas)
Tú tienes:
(Ax, Ay) ;A.angle ;(Bx, By) .Quiere comparar la dirección de movimiento de A con la dirección del vector AB.
Las coordenadas del vector AB se pueden calcular con una simple resta:
AB.x = Bx - Ax AB.y = By - AyPuede calcular el ángulo correspondiente al vector de dirección AB usando atan2 . Convenientemente, esa función es parte de la biblioteca matemática estándar de la mayoría de los lenguajes de programación.
Cuando usamos atan2, debemos tener cuidado con la convención. En los comentarios, especificaste que querías la convención en el sentido de las agujas del reloj. Para otras convenciones, consulte Wikipedia: atan2 y convenciones . También tenemos que convertir de radianes a grados, lo cual se puede hacer fácilmente con el factor de conversión 180 / pi .
AB.angle = atan2(AB.x, AB.y) * 180 / pi if AB.angle < 0: AB.angle = AB.angle + 360Entonces todo lo que tenemos que hacer es verificar si AB.angle está en el intervalo [A.angle - 180°, A.angle] (izquierda), o en el intervalo [A.angle, A.angle + 180°] (derecha), teniendo cuidado porque todos los cálculos son módulo 180°.
// assuming A.angle > 0 && A.angle < 360 if A.angle > 180: if AB.angle > A.angle - 180 && AB.angle < A.angle: return "Left" else: return "Right" else: // A.angle < 180 if AB.angle > A.angle && AB.angle < A.angle + 180: return "Right" else: return "Left"Vamos a romper esto.
Lo que necesitamos es el ángulo de la línea (contra el 'norte', también conocido como eje y positivo) que pasa por A y B. Esto nos permite comparar esos ángulos:
Sería más fácil encontrar la matemática correcta si su ángulo de 0° fuera 'este, en sentido contrario a las agujas del reloj' (como es la convención matemática), pero simplemente intercambiaremos x e y y estaremos listos (ya están cambiado en las siguientes líneas!).
Obtenemos ese ángulo (llamémoslo b) solo de los puntos, pero al principio estará en radianes (no en grados):
b_rad = Math.atan((Ax - Bx) / (Ay - By));No especificaste si el ángulo está en grados o en radianes. Suponiendo grados, el resultado debe convertirse de radianes:
b_deg = b_rad * (180 / Math.PI);Ahora solo necesitas tomar la diferencia:
delta = a_deg - b_deg;y use ese delta en la comparación que describí anteriormente.
(Si no pensé bien, esta matemática da los resultados opuestos de lo que se necesita; en este caso, debe intercambiar a_deg y b_deg en el cálculo delta)