2016-06-02 15 views
0

Ich habe zwei Linien durch jeweils zwei 3D-Punkte definiert (diese Punkte sind feste Werte). Ich möchte wissen, welcher der einfachste Weg ist, diese Linien zu "strecken", bis sie ihren Schnittpunkt im 3D-Raum finden.Finden Sie den Schnittpunkt zweier Linien in Matlab

Dies ist im Zusammenhang mit der Suche nach dem Brennpunkt einer Kamera mit Matlab.

+3

Es ist nicht garantiert, dass sich zwei Linien in 3D schneiden. Vielleicht wollten Sie zuerst ihre Projektion auf irgendeine Ebene finden? –

+0

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

Antwort

1

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:

  1. 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.

  2. Die Vektoren uA und uB sind identisch.Die Linien sind daher parallel und fallen entweder zusammen (pA == pB) oder schneiden sich niemals.

  3. Die Vektoren uA und uB sind unterschiedlich, aber eine Lösung existiert nicht. Die Linien sind schief und werden sich niemals schneiden.

Verwandte Themen