2D-Kollisionserkennung

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[gesichtete Version][unmarkierte Version]
(Kollision zwischen einem Kreis und einer Geraden: Abschnitt Verschobener Kreis hinzugefügt)
(Kollision zwischen einem Kreis und einer Geraden)
Zeile 325: Zeile 325:
  
 
[[Datei:Kollision kreis senkr-gerade.gif|miniatur|Veranschaulichung des Idealfalls mit senkrechter Geraden]]
 
[[Datei:Kollision kreis senkr-gerade.gif|miniatur|Veranschaulichung des Idealfalls mit senkrechter Geraden]]
Der einfachste Fall für eine Prüfung auf eine Kollision liegt vor, wenn die Gerade senkrecht oder waagerecht ist und der Mittelpunkt des Kreises dem Nullpunkt des Koordinatensystems entspricht oder die Gerade den Nullpunkt des Koordinatensystems schneidet. Ist die Gerade senkrecht, dann gibt es eine Kollision, wenn <math>-r \le x \le r</math> zutrifft. Ist die Gerade waagerecht, gibt es eine Kollision, wenn <math>-r \le y \le r</math> zutrifft. <math>r</math> steht in dem Fall für den Radius des Kreises, <math>x</math> für die x-Koordinate eines beliebigen Punkts auf der Geraden und <math>y</math> für die y-Koordinate einesn beliebigen Punkts auf der Geraden.
+
Der einfachste Fall für eine Prüfung auf eine Kollision liegt vor, wenn die Gerade senkrecht oder waagerecht ist und der Mittelpunkt des Kreises, nachfolgend <math>M</math> genannt, dem Nullpunkt des Koordinatensystems entspricht oder die Gerade den Nullpunkt des Koordinatensystems schneidet. Ist die Gerade senkrecht, dann gibt es eine Kollision, wenn <math>-r \le P_x \le r</math> zutrifft. Ist die Gerade waagerecht, gibt es eine Kollision, wenn <math>-r \le P_y \le r</math> zutrifft. <math>r</math> steht in dem Fall für den Radius des Kreises, <math>P_x</math> für die x-Koordinate eines beliebigen Punkts auf der Geraden und <math>P_y</math> für die y-Koordinate eines beliebigen Punkts, <math>P</math> auf der Geraden.
  
 
Nachfolgend soll der erste Fall als Idealfall genommen werden. In den Fällen, in denen der Kreis vom Nullpunkt versetzt oder die Gerade weder senkrecht noch waagerecht ist, wird zuerst die Umrechnung vorgenommen, sodass die Überprüfung erfolgen kann.
 
Nachfolgend soll der erste Fall als Idealfall genommen werden. In den Fällen, in denen der Kreis vom Nullpunkt versetzt oder die Gerade weder senkrecht noch waagerecht ist, wird zuerst die Umrechnung vorgenommen, sodass die Überprüfung erfolgen kann.
Zeile 331: Zeile 331:
 
==== Verschobener Kreis ====
 
==== Verschobener Kreis ====
  
Wenn die Gerade senkrecht oder waagerecht ist, der Mittelpunkt des Kreises aber nicht auf dem Nullpunkt des Koordinatensystems liegt, dann muss von dem Punkt der Geraden, der für die Kollisionsprüfung verwendet werden soll, der Mittelpunkt des Kreises abgezogen werden. Diese Berechnung kann unabhängig davon durchgeführt werden, ob die Gerade waagerecht oder senkrecht ist. Da bei einer Subtraktion des Mittelpunkts vom Mittelpunkt das Ergebnis immer der Nullpunkt des Koordinatensystems ist, entfällt diese Berechnung. Auf den über diese Rechnung erhaltenen Punkt kann wieder die jeweilige oben angeführte Überprüfung durchgeführt werden.
+
Wenn die Gerade senkrecht oder waagerecht ist, <math>M</math> aber nicht dem Nullpunkt des Koordinatensystems entspricht, dann muss von dem Punkt <math>P</math> der Geraden, der für die Kollisionsprüfung verwendet werden soll, <math>M</math> abgezogen werden. Diese Berechnung kann unabhängig davon durchgeführt werden, ob die Gerade waagerecht oder senkrecht ist. Da bei einer Subtraktion von <math>M</math> von <math>M</math> das Ergebnis immer der Nullpunkt des Koordinatensystems ist, entfällt diese Berechnung. Auf den über diese Rechnung erhaltenen Punkt kann wieder die jeweilige oben angeführte Überprüfung durchgeführt werden.
  
 
==== Verdrehte Gerade ====
 
==== Verdrehte Gerade ====
  
<!-- verdrehte bzw. schräge Gerade - Drehung um den Nullpunkt des Koordinatensystems - coming soon -->
+
Ist die Gerade verdreht, muss diese erst gedreht werden, damit sie senkrecht oder waagerecht ist. Um einen Punkt um den Mittelpunkt des Koordinatensystems zu drehen, kann man die Berechnungen <math>P'_x = P_x*cos(\alpha) - P_y*sin(\alpha)</math> und <math>P'_y = P_x*sin(\alpha) + P_y*cos(\alpha)</math> verwenden. <math>P'</math> stellt dabei den Punkt nach der Drehung dar. Für diese Drehung muss also nicht der entsprechende Winkel selbst, sondern dessen Ergebnis der Sinus- und Kosinus-Funktion ermittelt werden. Wenn man einen weiteren Punkt der Geraden, nachfolgend <math>Q</math> genannt, nimmt, kann man diese über das dadurch darstellbare rechtwinklige (Steigungs-)Dreieck ermitteln. Die Rechnungen dafür lauten <math>sin(\alpha) = \frac{\text{Gegenkathete}}{\text{Hypotenuse}}</math> und <math>cos(\alpha) =\frac{\text{Ankathete}}{\text{Hypotenuse}}</math>. Da die Drehung gegen den Uhrzeigersinn geht, muss für eine steigende Gerade ein anderer Wert gewählt werden, als für eine fallende Gerade. Für eine steigende Gerade ist die Seite des Dreiecks, die sich durch die x-Koordinaten errechnet, die Gegenkathete und für eine fallende Gerade ist die Seite des Dreiecks, die sich durch die y-Koordinaten errechnet die Gegenkathete.
 +
 
 +
Fasst man alle Berechnungen zusammen, erhält man die folgende Vorgehensweise. Es wird angenommen, dass die Punkte der Gerade <math>P</math> und <math>Q</math> gegeben sind.
 +
* Die Differenz der Punkte P und Q, <math>R</math> wird mit <math>R = \left| P - Q \right|</math> ermittelt
 +
* Die Hypotenuse <math>H</math> wird ermittelt durch <math>H = \sqrt{R_x^2 + R_y^2}</math>.
 +
* Wenn <math>P_x < Q_x \land P_y < Q_y \lor P_x > Q_x \land P_z > Q_z</math> zutrifft:
 +
** Das Ergebnis des Kosinus, <math>c</math>, wird ermittelt mit <math>c = \frac{R_y}{H}</math>.
 +
** Das Ergebnis des Sinus, <math>s</math>, wird ermittelt mit <math>s = \frac{R_x}{H}</math>.
 +
** Die x-Koordinate des gedrehten Punkts <math>x'</math> wird ermittelt mit <math>x' = P_xc - P_ys</math>.
 +
** Wenn <math>-r \le x \le r</math> zutrifft, liegt eine Kollision vor.
 +
* Sonst:
 +
** Das Ergebnis des Kosinus, <math>c</math>, wird ermittelt mit <math>c = \frac{R_x}{H}</math>.
 +
** Das Ergebnis des Sinus, <math>s</math>, wird ermittelt mit <math>s = \frac{R_y}{H}</math>.
 +
** Die y-Koordinate des gedrehten Punkts <math>y'</math> wird ermittelt mit <math>y' = P_xs - P_yc</math>.
 +
** Wenn <math>-r \le y \le r</math> zutrifft, liegt eine Kollision vor.

Version vom 23. November 2011, 23:34 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge