2017-04-11 260 views
0

我一直在用MATLAB編寫程序,描述如何在2D中找到點和線段之間的最短距離(Shortest distance between a point and a line segment )。我需要的功能基本上與以前回答的問題基本相同,但在3D中而不是2D和MATLAB中。線段與三維點之間的最短距離(3D)

這個以前的文章的答案沒有頂部的評論是在MATLAB中,所以我有一些麻煩理解這段代碼幕後發生了什麼。也許你們中有些人更聰明或者更熟練,可以幫助我將其轉換爲3D MATLAB代碼?線段將被定義爲兩個點S1(x1,y1,z1)和S2(x2,y2,z2),並且該點僅僅是單個座標Pnt(x3,y3,z3)。

編輯:這裏似乎有點混亂。我的確意味着線段不是無限的線條。我附上了我正在使用的代碼。我想補充一點,我修改的代碼最初是作爲上述鏈接線程的註釋的一部分編寫的,原始作者Peter Karasev值得讚揚。現在,代碼工作在2D中,我已經在3條線中進行了評論,這些條目開始使它成爲3D(vz,uz和lenSqr)。我的具體問題是,我真的不明白使用detP以數學方式發生了什麼,以及如何使detP和隨後的if語句在3D中工作。

輸入如上在原始問題文本中定義。

function r = PointToLineSegment3D(S1, S2, Pnt) 
% r = PointToLineSegment3D(S1, S2, Pnt) 

vx = S1(1)-Pnt(1); 
vy = S1(2)-Pnt(2); 
% vz = S1(3)-Pnt(3); 

ux = S2(1)-S1(1); 
uy = S2(2)-S1(2); 
% uz = S2(3)-S1(3); 

lenSqr= (ux*ux+uy*uy); % +uz*uz 
detP= -vx*ux + -vy*uy; 

if(detP < 0) 
    r = norm(S1-Pnt,2); 

elseif(detP > lenSqr) 
    r = norm(S2-Pnt,2); 

else 
    r = abs(ux*vy-uy*vx)/sqrt(lenSqr); 
end 
end 
+1

到目前爲止,您在3-D中嘗試了些什麼?本網站不是代碼編寫服務。請向我們展示您的代碼並描述您擁有的具體問題。你的問題(假設你的意思是一個由兩點定義的行)[在MathWorld這裏完整描述](http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html),包括非常簡單的公式。 – horchler

+0

http:// stackoverflow。com/questions/43207514 /爲2d和3d工作 – MBo

+0

感謝@horchler的回覆,我添加了您請求的信息。 – AndrewTLombardo

回答

0

對於未來發現此問題的用戶,這是我在MATLAB中使用3D進行工作的代碼。這不適用於只有線段的無限行。

function r = PointToLineSegment3D(S1, S2, Pnt) 
% r = PointToLineSegment3D(S1, S2, Pnt) 

vx = S1(1)-Pnt(1); 
vy = S1(2)-Pnt(2); 
vz = S1(3)-Pnt(3); 

ux = S2(1)-S1(1); 
uy = S2(2)-S1(2); 
uz = S2(3)-S1(3); 

lenSqr= (ux*ux+uy*uy+uz*uz) 


detP= -vx*ux + -vy*uy + -vz*uz; 

if(detP < 0) 
    r = norm(S1-Pnt,2); 

elseif(detP > lenSqr) 
    r = norm(S2-Pnt,2); 

else 
    r =norm(abs(cross((S2-S1),(S1-Pnt)))/sqrt(lenSqr)); 
end 
end 
1

只要定義ABP作爲列向量。然後就行AB任何點X具有用於t一些值的形式

X = A+t*(B-A) 

而且肯定行XP必須垂直於行AB,這意味着對應標產品必須是零:

0 == (A+t*(B-A) - P)' * (B-A) == (A-P)'*(B-A)+t*norm(B-A)^2 

這意味着

t = (A-P)'*(B-A)/norm(B-A)^2 

然後,它僅僅是一個事計算距離XP

d = norm(X-P) 

所以

d = norm(A+t*(B-A)-P) 

所以,你只需要使用第三和我已經張貼在這裏的代碼的第五行,如果我沒有弄錯,你是好去。

相關問題