Dado un rectángulo y un punto con una dirección vectorial hacia el rectángulo. ¿Cómo puedo encontrar el punto más cercano en el exterior de ese rectángulo al punto en cuestión?
Dado un rectángulo y un punto con una dirección vectorial hacia el rectángulo. ¿Cómo puedo encontrar el punto más cercano en el exterior de ese rectángulo al punto en cuestión?
Respuestas:
Una técnica que podría utilizar se llama "fundición de rayos". Se usa comúnmente para renderizar gráficos, pero tiene otras aplicaciones, como la línea de visión (como desea hacer) y la búsqueda de rutas. En términos generales, funciona al encontrar la intersección de un rayo y un objeto. En tu ejemplo, el rayo es el vector para la dirección del personaje.
Una referencia útil para las intersecciones de rayos / objetos (y, por cierto, otras intersecciones de objetos / objetos) es www.realtimerendering.com/intersections.html (busque en las referencias ray / aabb y ray / obb).
El rectángulo tiene cuatro lados. Cada lado es un segmento de línea.
Prueba cada uno de los cuatro lados para la intersección con el rayo. Rastrea el golpe más cercano.
Aquí hay un código para averiguar en qué parte del segmento impacta el rayo:
bool intersect(const ray& ray, const segment& segment,point& hit) {
// where do we intersect this line?
float t = ((ray.direction.x * ray.origin.y + ray.direction.y *
(segment[0].x - ray.origin.x)) -
(ray.direction.x * segment[1].y)) /
(ray.direction.y * (segment[0].x + segment[1].x) -
ray.direction.x * (segment[0].y + segment[1].y));
if(t >= 0.0 && t<=1.0) { // in the segment
hit = segment[0] + (segment[1]-segment[0]*t); // lerp
return true;
}
return false; // no hit
}
Si su caja está alineada con el eje, solo tiene que sujetar cada eje de coordenadas a la caja si el punto está fuera de la caja.
De RTCD pg 130:
// Do this for all 3 axes
if( point.x < min.x ) point.x = min.x ;
else if( point.x > max.x ) point.x = max.x ;
Si hace esto para los ejes x, y, z, entonces se point
cerrará de golpe a la pared más cercana de la caja, si está fuera de la caja, para empezar. si ya está dentro de la caja, se dejará solo (donde está).
Bueno, puedes usar solo álgebra lineal (geometría analítica, para ser más específico) para resolver esto. Depende de cómo modelaste el rectángulo.
Aquí hay un caso general: http://paulbourke.net/geometry/lineline2d/