Kollision Kreis-Linie

TimN

Erfahrenes Mitglied
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:

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?
 
Hallo,

Ich hänge jetzt bei folgender Zeile:

const float UDotPMinusM = Vector2D_Dot(LineDir, PMinusM);

Vector2D_Dot ist IRGENDEINE Funktion, die mir nicht bekannt ist

Die Funktion Vector2D_Dot scheint wohl das Skalarprodukt zu sein.
Dabei kommt ein skalarer Wert (daher der Name) und kein neuer Vektor raus.

Markus
 
Hallo, danke für die Antwort.
Das ist mir auch gerade eben aufgefallen. Der Kommentar ( u * (p - m) ) hat mich wohl ein wenig verwirrt.
 
Zurück