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 0wenn 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.