2D Funktion für 3D Umbauen?



  • Hi,

    Ich habe eine Funktion für die Abfrage ob es einen Schnittpunkt zwischen 2 Linien gibt in 2D, diese möchte ich jedoch auf 3D erweitern komm jedoch schon bei der Berechnung der Determinante nicht weiter 😞

    Kann mir jemand helfen?

    Hier die Funktion:

    bool lineHitsLine (const vector3D& p, const vector3D& u,
                                                           const vector3D& q, const vector3D& v,
                                                           vector3D* out = NULL)
    {
        // Die Determinante D berechnen
        const double D = u.y * v.x - u.x * v.y;
    
        // Wenn D null ist, sind die Linien parallel.
        if(D < 0.0001 && D > -0.0001) return false;
    
        // Determinante Ds berechnen
        const float Ds = (q.y - p.y) * v.x - (q.x - p.x) * v.y;
    
        // s = Ds / D berechnen und prüfen, ob s in den Grenzen liegt
        const float s = Ds / D;
        if(s < 0.0 || s > 1.0) return false;
    
        // Jetzt berechnen wir Dt und t.
        const float Dt = (q.y - p.y) * u.x - (q.x - p.x) * u.y;
        const float t = Dt / D;
        if(t < 0.0 || t > 1.0) return false;
    
        // Die Linien schneiden sich!
        // Wir tragen den Schnittpunkt ein.
        if(out) 
            *out = p + s * u;
    
        return true;
    }
    

    Wie kann ich die auf 3D erweitern?



  • zwei Geraden sind parallel wenn ihr Schnittwinkel 0 grad ist
    hat man die Richtungsvektoren der Geraden so ist
    \[cos(\alpha)=\frac{r1_{x}\*r2_{x}+r1_{y}\*r2_{y}+r1_{z}*r2_{z}}{\left| r1 \right|\left| r2 \right|}} \]
    der Cosinus wird im Falle von Parallelität 1 und das Kreuzprodukt ist 0

    wenn man den Schnittpunkt berechnen will dann geht das

    \[X=P0_{1}+t*r1\] \[X=P0_{2}+s*r2\] \[P0_{1}+t\*r1=P0_{2}+s\*r2\] \[P0_{1}-P0_{2}=s\*r2-t\*r1\] \[P0_{1}-P0_{2}=dX\] \[dX_{x}=s\*r2_{x}-t\*r1_{x}\] \[dX_{y}=s\*r2_{y}-t\*r1_{y}\] \[dX_{z}=s\*r2_{z}-t\*r1_{z}\]

    was ein überbestimmtes lineares GlS für s und t ist, welches Rang 2 hat für einen Schnittpunkt oder Windschiefe Lage, oder Rang 1 für parallel oder Gerade 1 ist die gleiche Gerade wie zwei.


Anmelden zum Antworten