Wie die Kommentatoren erwähnt haben, gibt es keine Garantie für eine Lösung. Sie können jedoch systematisch ermitteln, ob eine Lösung vorhanden ist und, falls vorhanden, die Lösung. Ich werde die Methode in meist Pseudo-Code skizzieren:
Es ist am einfachsten, jede Zeile in Bezug auf einen Punkt und einen normalisierten Einheitsvektor für die Richtung auszudrücken. Gegeben Punkte A1, A2 auf der Linie A und B1, B2 auf der Linie B, kann dies geschehen wie folgt:
pA = A1, uA = (A2-A1)/norm(A2-A1).
pB = B1, uB = (B2-B1)/norm(B2-B1).
Beachten Sie, dass norm(uA) = 1
und norm(uB) = 1
.
Dann können Punkte entlang der Linie A ausgedrückt werden als:
pA + cA * uA
Und Punkte entlang der Linie B ausgedrückt werden:
pB + cB * uB
Das Problem ist dann einer von der Suche nach Koeffizienten wird cA
und cB
solchen dass die Linien übereinstimmen, oder:
pA + cA * uA = pB + cB * uB
Um dies zu lösen, können wir einige vereinfachte Transformationen durchführen. Zuerst Gruppe die pA
und pB
Begriffe auf der einen Seite, und die uA
und uB
Begriffe auf der anderen Seite:
cA * uA - cB*uB = pB - pA = vp
wo vp = pB-pA
. Dann nehmen Sie das Skalarprodukt jeder Seite sowohl mit uA
und uB
:
cA - cB*dot(uA,uB) = dot(uA,vp)
cA*dot(uA,uB) - cB = dot(uB,vp)
wo dot(x,y)
ist das Skalarprodukt von Vektoren x
und y
, und wir haben die Punktprodukte dot(uA,uA) = norm(uA)^2 = 1
und dot(uB,uB) = norm(uB)^2 = 1
vereinfacht.
Dies gibt Ihnen zwei skalaren Gleichungen mit zwei Unbekannten, und entspricht der Matrixgleichung:
[ 1, -dot(uA,uB) ; dot(uA,uB), -1 ] * C = [ dot(uA,vp) ; dot(uB,vp) ]
du in Matlab lösen kann mit der Rücksubstitution Operator \
:
C = [ 1, -dot(uA,uB) ; dot(uA,uB), -1 ] \ [ dot(uA,vp) ; dot(uB,vp) ]
Es gibt drei Möglichkeiten:
Eine Lösung für die Matrixgleichung existiert, die anzeigt, dass die Linien. Die Lösung gibt die Werte cA
und cB
für den Schnittpunkt an.
Die Vektoren uA
und uB
sind identisch.Die Linien sind daher parallel und fallen entweder zusammen (pA == pB
) oder schneiden sich niemals.
Die Vektoren uA
und uB
sind unterschiedlich, aber eine Lösung existiert nicht. Die Linien sind schief und werden sich niemals schneiden.
Es ist nicht garantiert, dass sich zwei Linien in 3D schneiden. Vielleicht wollten Sie zuerst ihre Projektion auf irgendeine Ebene finden? –
Wie @MadPhysicist sagte, sind sie nicht garantiert, sich zu schneiden. Sie werden wahrscheinlich die kürzeste Linie zwischen den beiden finden und den Mittelpunkt nehmen. Paul Bourke hat eine großartige Beschreibung, wie Sie dies tun: http://paulbourke.net/geometry/pointlineplane/ und es gibt eine MATLAB-Implementierung hier: http://paulbourke.net/geometry/pointlineplane/linelinintersect.m – Suever