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