Gegeben ein Rechteck und einen Punkt mit einer Vektorrichtung zum Rechteck. Wie finde ich den Punkt außerhalb des Rechtecks, der dem betreffenden Punkt am nächsten liegt?
Gegeben ein Rechteck und einen Punkt mit einer Vektorrichtung zum Rechteck. Wie finde ich den Punkt außerhalb des Rechtecks, der dem betreffenden Punkt am nächsten liegt?
Antworten:
Eine Technik, die Sie verwenden könnten, heißt "Ray Casting". Es wird häufig zum Rendern von Grafiken verwendet, verfügt jedoch über andere Anwendungen wie Sichtverbindung (wie Sie es möchten) und Pfadfindung. Im Allgemeinen funktioniert es, indem der Schnittpunkt eines Strahls und eines Objekts gefunden wird. In Ihrem Beispiel ist der Strahl der Vektor für die Richtung des Charakters.
Eine nützliche Referenz für Ray / Objekt-Schnittpunkte (und im Übrigen andere Objekt / Objekt-Schnittpunkte) ist www.realtimerendering.com/intersections.html (siehe unter den Referenzen für ray / aabb und ray / obb).
Das Rechteck hat vier Seiten. Jede Seite ist ein Liniensegment.
Testen Sie jede der vier Seiten auf Schnittpunkte mit dem Strahl. Verfolgen Sie den nächsten Treffer.
Hier ist ein Code, um herauszufinden, wo auf dem Segment der Strahl trifft:
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
}
Wenn Ihre Box achsenausgerichtet ist, müssen Sie nur jede Koordinatenachse an die Box klemmen, wenn sich der Punkt außerhalb der Box befindet.
Aus RTCD S. 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 ;
Wenn Sie dies für die x-, y- und z-Achse tun, wird die Achse point
auf die nächste Wand der Box zugeschlagen, wenn sie sich zunächst außerhalb der Box befindet. Wenn es sich bereits in der Box befindet, wird es in Ruhe gelassen (wo es ist).
Nun, Sie können nur lineare Algebra (genauer gesagt analytische Geometrie) verwenden, um dies zu lösen. Dies hängt davon ab, wie Sie das Rechteck modelliert haben.
Hier ist ein allgemeiner Fall: http://paulbourke.net/geometry/lineline2d/