¿Cómo puedo probar si un punto se encuentra entre dos líneas paralelas?

9

En el juego que estoy diseñando hay una explosión que se dispara desde un punto de origen hacia la dirección del mouse. El ancho de esta explosión siempre será el mismo.

A lo largo de la parte inferior de la pantalla (lo que hay actualmente) se mueven cuadrados sobre los que debería afectar la explosión que controla el jugador.

Actualmente estoy tratando de encontrar una manera de descubrir si las esquinas de estos cuadrados se encuentran dentro de las dos líneas límite de la explosión. Pensé que la mejor manera de hacer esto sería rotar las esquinas del cuadrado alrededor de un punto de origen como si la explosión fuera completamente horizontal y ver si los valores Y de las esquinas eran menores o iguales que el ancho de la explosión. significa que se encuentran dentro de la región afectada, pero no puedo resolver

Harold
fuente

Respuestas:

11

El punto está entre las 2 líneas paralelas si es un lado de una línea y el otro lado de la otra línea (siempre que las líneas apunten en la misma dirección).

Puede usar la respuesta superior de esta pregunta en stackoverflow para determinar en qué lado de una línea (definida por 2 puntos) se encuentra un punto.


Un método alternativo sería calcular la distancia desde el punto hasta una línea media y compararla con la mitad del grosor de la explosión.

George Duckett
fuente
2

Así es como lo hago (con una verificación adicional de si los planos provistos son o no paralelos. Los objetos Plane contienen la ecuación plana de esta forma: Ax + By + Cz + D = 0, que puede generar fácilmente a partir de 3 dados puntos, o desde un punto y un normal (vea esta página si no está seguro acerca de las matemáticas: http://paulbourke.net/geometry/pointlineplane/ )

bool isPointBetweenParallelPlanes(const vec3 point, const Plane a, const Plane b){
// test if planes are parallel
vec3 cross = a.normal CROSS b.normal;
assert((a.normal CROSS b.normal) == vec3(0,0,0) && "These planes should be parallel.");
return ((a.normal DOT point) + a.D) * ((b.normal DOT point) + b.D) < 0.0;
}
Jeroen Baert
fuente