Suchen Sie den nächstgelegenen Punkt entlang eines Rechtecks ​​mit einem anderen Punkt und einer anderen Richtung

8

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?

Punkt mit Blick auf das Rechteck

onedayitwillmake
quelle
Können Sie mehr erklären, was Sie fragen? Ich verstehe es wirklich nicht.
Angenommen, ich habe ein Zeichen vor einem Objekt (einem Rechteck) und zeichne eine imaginäre Linie von diesem Zeichen zum Rechteck. Ich möchte wissen, wie ich feststellen kann, welchen Punkt an der Außenseite des rechteckigen Objekts die Linie berührt.
Tag wird
1
Das in Google nachzuschlagende Schlüsselwort lautet "AABB" (achsenausgerichteter Begrenzungsrahmen). Wenn Ihre "Box" (Rechteck) noch nicht achsenausgerichtet ist, kann eine einfache Transformationsmatrix - die natürlich für alle Elemente verwendet wird, die Sie interessieren - zuerst verwendet werden, um sie in eine zu ändern.
Martin Sojka

Antworten:

6

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).

Luke Van In
quelle
9

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
}
Wille
quelle
1

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 pointauf 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).

Bobobobo
quelle
0

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/


quelle