2D Kollision: Punkt mit rotiertem Rechteck?
-
Hi,
ich habe ein Rechteck, min wert ist 0x0 und max wert ist 180x90
Dies habe ich nun um x° gedreht und möchte Testen ob ein Punkt mit dem Dingen kollidiert.
Ich habe gegoogelt doch keine Lösung gefunden
Ich höff ihr könnt mir helfen.Ich hab erstmal so angefangen:
// rx = x position des rechtecks // ry = y position des rechtecks // rw = breite des rechtecks // rh = höhe des rechtecks // degrees = um wieviel Grad wurde das Rechteck gedreht? // point_x = x position des Punktes // point_y = y position des Punktes bool collPointWithRect (int rx, int ry, int rw, int rh, int degrees, int point_x, int point_y) { // ### Erst normal testen: if ((point_x > rx && point_x < rx+rw) && (point_y > ry && point_y < ry+rh)) { // Punkt wäre mit Rechteck kolldiert ohne Rotation // Berechnung mit Rotation: // berechnung??? } return (false); }Doch ich weis nicht wie ich weiter vorgehen kann

-
es gibt immer 2 wege zu drehen
man dreht das Rechteck und der Punkt hat konstante Lage
oder
man lässt das Rechteck konstant und dreht den Punkt entgegengesetzt
-
Versuch's mal mit Vektorrechnung.
-
Noch eine Möglichkeit (die den Vorteil hat bei jedem konvexen Polygon zu funktionieren).
Natürlich viel aufwendiger als einfach den Punkt zu rotieren.
Wenn die Punkte A'B'C'D' dein rotiertes Rechteck bilden und X der Punkte ist, von dem du testen möchtest ob er mit dem Rechteck kollidiert, könntest
du das z.B. so machen:Bilde die Vektoren XA, XB, XC, XD Jetzt berechne nacheinander die Skalarprodukte dotXAXB = XA*XB/(||XA||*||XB||) dotXBXC = XB*XC/(||XB||*||XC||) dotXCXD = XC*XD/(||XC||*||XD||) dotXDXA = XA*XD/(||XD||*||XA||) Berechne jetzt den Winkel: alpha = acos(dotXAXB) + acos(dotXBXC) + acos(dotXCXD) + acos(dotXDXA)Ist alpha = 2pi. Dann liegt der Punkt innerhalb des Rechtecks,
ansonsten liegt er außerhalb.
(du solltest bei der Implementierung allerdings nicht auf Gleichheit prüfen sondern eher so etwas machen alpha + 0.0001 >= 2pi)Viele Grüße
Fischi
-
hi,
was meinst du mit
"(||XA||*||XB||)" ???
-
--- schrieb:
hi,
was meinst du mit
"(||XA||*||XB||)" ???XA ist derjenige Vektor, so dass gilt X + XA = A
Mit ||XA|| meine ich die euklidische Norm dieses Vektors.
Also sqrt(XA.x² + XA.y²) im 2D.
Also ist der gesamte Ausdruck
sqrt(XA.x² + XA.y²)*sqrt(XB.x² + XB.y²)
Viele Grüße
Fischi
-
ich versteh zwar kaum was, aber ich frag mal meinen Mathelehrer.
-
--- schrieb:
ich versteh zwar kaum was, aber ich frag mal meinen Mathelehrer.
Was verstehst du denn alles nicht?
Viele Grüße
Fischi