Hallo,
auf der Suche nach einer Methode um die Kollision zwischen einem Kreis und einer Linie zu erkennen bin ich auf folgende Seite gestoßen:
http://www.scherfgen-software.net/index.php?action=tutorials&topic=collision2d_2
Dort ist diese Funktion zu finden:
Ich hänge jetzt bei folgender Zeile:
const float UDotPMinusM = Vector2D_Dot(LineDir, PMinusM);
Vector2D_Dot ist IRGENDEINE Funktion, die mir nicht bekannt ist. Jedoch wird laut Kommentar LineDir (Vector2D) und PMinusM (Vector2D) multipliziert. Und es kommt eine Zahl (float) heraus. Wie kann das sein? Denke ich greade falsch?
Kann mir jemand sagen, wie ich das Problem lösen kann? Oder kennt jemand eine andere Funktion zur Kollisionserkennung?
auf der Suche nach einer Methode um die Kollision zwischen einem Kreis und einer Linie zu erkennen bin ich auf folgende Seite gestoßen:
http://www.scherfgen-software.net/index.php?action=tutorials&topic=collision2d_2
Dort ist diese Funktion zu finden:
Code:
bool LineHitsCircle(const Vector2D& LineStart,
const Vector2D& LineEnd,
const Vector2D& CircleCenter,
const float Radius,
Vector2D* const pOut = 0)
{
// r² vorberechnen
const float RadiusSq = Radius * Radius;
// (p - m) vorberechnen
const Vector2D PMinusM(LineStart - CircleCenter);
// Wenn der Startpunkt der Linie schon im Kreis liegt,
// dann brechen wir sofort ab.
if(PMinusM.LengthSq() <= RadiusSq)
{
// Als Schnittpunkt nehmen wir einfach
// den Startpunkt der Linie.
if(pOut) *pOut = LineStart;
return true;
}
// Richtungsvektor der Linie berechnen (u)
const Vector2D LineDir(LineEnd - LineStart);
// u * (p - m) vorberechnen
const float UDotPMinusM = Vector2D_Dot(LineDir, PMinusM);
// u² vorberechnen
const float LineDirSq = LineDir.LengthSq();
// Die Diskriminante berechnen:
// (u * (p - m))²
// - (u² * ((p - m)² - r²))
const float d = UDotPMinusM * UDotPMinusM
- LineDirSq * (PMinusM.LengthSq() - RadiusSq);
// Ist die Diskriminante negativ, null oder positiv?
if(d < 0.0f) return false;
else if(d < 0.0001f)
{
// Die Diskriminante ist (ungefähr) null.
// Die gesamte Wurzel entfällt und die Lösung ist:
// (-u * (p - m)) / u².
// Wir müssen nur noch prüfen, ob der Wert
// im korrekten Bereich [0; 1] liegt.
const float s = -UDotPMinusM / LineDirSq;
if(s < 0.0f || s > 1.0f) return false;
else
{
// Berührpunkt!
if(pOut) *pOut = LineStart + s * LineDir;
return true;
}
}
else
{
// Die Gerade schneidet den Kreis zweimal.
// Uns interessiert nur die kleinere Lösung für s,
// denn das ist die Stelle, wo die Linie den Kreis
// "zum ersten Mal" schneidet.
// Diese Lösung berechnen wir nun.
const float s = (-UDotPMinusM - sqrtf(d)) / LineDirSq;
if(s < 0.0f || s > 1.0f) return false;
else
{
if(pOut) *pOut = LineStart + s * LineDir;
return true;
}
}
}
Ich hänge jetzt bei folgender Zeile:
const float UDotPMinusM = Vector2D_Dot(LineDir, PMinusM);
Vector2D_Dot ist IRGENDEINE Funktion, die mir nicht bekannt ist. Jedoch wird laut Kommentar LineDir (Vector2D) und PMinusM (Vector2D) multipliziert. Und es kommt eine Zahl (float) heraus. Wie kann das sein? Denke ich greade falsch?
Kann mir jemand sagen, wie ich das Problem lösen kann? Oder kennt jemand eine andere Funktion zur Kollisionserkennung?