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


Anmelden zum Antworten