2D-Kollisionserkennung

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[gesichtete Version][unmarkierte Version]
(Kollision zwischen zwei Strecken)
Zeile 235: Zeile 235:
  
 
Die Kollisionserkennung zwischen zwei Strecken erfolgt ähnlich wie bei den Geraden, nur mit einem kleinen Zusatz, denn Strecken haben einen Start- und Endpunkt. Deswegen werden Strecken auch als Geradenabschnitt bezeichnet. Es wird also wieder überprüft, ob die beiden Strecken parallel zu einander sind. Wenn dies der Fall ist und die Strecken sich auch nicht überlappen, liegt keine Kollision vor. Ansonsten muss noch überprüft werden, ob sich die Strecken in den angegebenen Abschnitten schneiden. Nur wenn das zutrifft, liegt eine Kollision vor.
 
Die Kollisionserkennung zwischen zwei Strecken erfolgt ähnlich wie bei den Geraden, nur mit einem kleinen Zusatz, denn Strecken haben einen Start- und Endpunkt. Deswegen werden Strecken auch als Geradenabschnitt bezeichnet. Es wird also wieder überprüft, ob die beiden Strecken parallel zu einander sind. Wenn dies der Fall ist und die Strecken sich auch nicht überlappen, liegt keine Kollision vor. Ansonsten muss noch überprüft werden, ob sich die Strecken in den angegebenen Abschnitten schneiden. Nur wenn das zutrifft, liegt eine Kollision vor.
 +
 +
{{Spoiler|
 +
<xh4>Implementierung in C++</xh4>
 +
|
 +
<sourcecode lang="cpp" tab="4">
 +
bool lineSegmentCollision(const Vector& a1, const Vector& a2,
 +
          const Vector& b1, const Vector& b2)
 +
{
 +
const float denom = (b2.y - b1.y) * (a2.x - a1.x) -
 +
(b2.x - b1.x) * (a2.y - a1.y);
 +
if (abs(denom) < EPSILON)
 +
return false
 +
 +
const float ua = ((b2.x - b1.x) * (a1.y - b1.y) -
 +
  (b2.y - b1.y) * (a1.x - b1.x)) / denom;
 +
const float ub = ((a2.x - a1.x) * (a1.y - b1.y) -
 +
  (a2.y - a1.y) * (a1.x - b1.x)) / denom;
 +
return ua >= 0 && ua <= 1 && ub >= 0 && ua <= 1;
 +
}
 +
</sourcecode>
 +
}}

Version vom 4. November 2011, 16:10 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge