2D-objektausgerichteter Bounding-Box-Schnittpunkttest


9

Ich habe zwei objektausgerichtete Begrenzungsrahmen (dh nicht achsenausgerichtet, sie drehen sich mit dem Objekt). Ich würde gerne wissen, ob sich zwei objektausgerichtete Felder überlappen. ( Bearbeiten: Hinweis - Ich verwende einen achsenausgerichteten Begrenzungsrahmen-Test, um entfernte Objekte schnell zu verwerfen. Es spielt also keine Rolle, ob die Quad-Routine etwas langsamer ist. )

Meine Boxen werden als vier x, y Punkte gespeichert. Ich habe nach Antworten gesucht, aber ich kann die Variablennamen und Algorithmen in Beispielen nicht verstehen, um sie auf meinen speziellen Fall anzuwenden.

Kann mir jemand helfen, mir klar und einfach zu zeigen, wie das geht? Vielen Dank. (Die jeweilige Sprache ist nicht wichtig, Pseudocode im C-Stil ist in Ordnung.)

Antworten:


5

Wenn Sie wissen, wo Sie suchen müssen, ist es einfach. Sie suchen nach oobb. Gehen Sie hier: http://www.realtimerendering.com/intersections.html .
Dort finden Sie einen Link zu dieser Site http://www.geometrictools.com/LibMathematics/Intersection/Intersection.html
und dort den richtigen Code. (Strg + f "Schnittpunkt der Kästchen (2D)")

Es verwendet SAT und enthält Quellcodes und Artikel.


Der von den Geometrictools beschriebene Algorithmus ist der, auf den ich hingewiesen hätte.
Jari Komppa

Ich verstehe, dass dies vor 4 Jahren war, aber erkläre immer eine Ablehnung und all das. Dies ist hübsch "Ihre Antwort ist in einem anderen Schloss", und jetzt scheint die Antwort im zweiten Fall nicht einmal da zu sein.
Yann

2

Der einfachere Weg ist wahrscheinlich, jeden Scheitelpunkt von Feld B gegen jede Seite von Feld A zu testen (berechnen Sie den vorzeichenbehafteten Abstand). Auf diese Weise können Sie jeden Scheitelpunkt als "vor" oder "hinter" dem Segment klassifizieren.

Wenn alle Scheitelpunkte von B als "vor" einem der Segmente von A klassifiziert sind, überlappen sich B und A nicht. sonst tun sie es.

Dies ist etwas kompliziert, so dass Sie möglicherweise einen Leistungsgewinn erzielen, indem Sie zuerst eine Kreis-Kreis-Prüfung durchführen und dabei die Begrenzungskreise der Quadrate verwenden (trivial zu berechnen).


Ich mache zuerst einen achsenausgerichteten Begrenzungsrahmen-Test, um entfernte Objekte schnell zu verwerfen. Haben Sie weitere Details zum Quad-Quad-Test?
AshleysBrain

Drehen Sie beide Quads vorübergehend mit derselben Transformation, sodass einer von ihnen achsenausgerichtet endet. Verwenden Sie dann den SAT-Test, wie nicht erwähnt. Wenn das Ergebnis gefunden wird, kehren Sie die Drehung um, um sie zurückzubekommen.
Steve H
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.