Dato un rettangolo e un punto con una direzione vettoriale verso il rettangolo. Come posso trovare il punto più vicino all'esterno di quel rettangolo rispetto al punto in questione?
Dato un rettangolo e un punto con una direzione vettoriale verso il rettangolo. Come posso trovare il punto più vicino all'esterno di quel rettangolo rispetto al punto in questione?
Risposte:
Una tecnica che potresti usare è chiamata "ray casting". È comunemente usato per il rendering di grafica, ma ha altre applicazioni come la visuale (come si desidera fare) e la ricerca del percorso. In termini generali, funziona trovando l'intersezione di un raggio e un oggetto. Nel tuo esempio il raggio è il vettore per la direzione del personaggio.
Un riferimento utile per le intersezioni raggio / oggetto (e per inciso altri incroci oggetto / oggetto) è www.realtimerendering.com/intersections.html (guardare sotto i riferimenti per ray / aabb e ray / obb).
Il rettangolo ha quattro lati. Ogni lato è un segmento di linea.
Prova ciascuno dei quattro lati per l'intersezione con il raggio. Traccia il colpo più vicino.
Ecco un po 'di codice per scoprire dove colpisce il segmento sul raggio:
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
}
Se il riquadro è allineato all'asse, è sufficiente bloccare ciascun asse di coordinate sul riquadro se il punto si trova all'esterno del riquadro.
Da 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 ;
Se lo fai per gli assi x, y, z, allora point
verrà sbattuto contro la parete più vicina della scatola, se è fuori dalla scatola per cominciare. se è già all'interno della scatola, verrà lasciato solo (dove si trova).
Bene, puoi usare solo l'algebra lineare (geometria analitica, per essere più specifici) per risolvere questo problema. Dipende da come hai modellato il rettangolo.
Ecco un caso generale: http://paulbourke.net/geometry/lineline2d/