2017-04-11 149 views
0

私は、2Dで点と線分の最短距離を見つける方法を記述する優れたスレッドをMATLABにプログラムを構築しています(Shortest distance between a point and a line segment )。私は、以前に答えられた質問と本質的に同じではなく、2DとMATLABの代わりに3Dで機能する関数が必要です。線分と3次元の点との最短距離

この前の投稿への回答のための一番上のコメントは、MATLABにありませんので、私はこのコードの裏で何が起こっているのか理解していません。たぶん、賢くて熟練している人がいますが、これを3D MATLABコードに変換するのに役立つでしょうか?

線分は、2つの点S1(x1、y1、z1)とS2(x2、y2、z2)として定義され、その点は単なる座標Pnt(x3、y3、z3)です。

編集:ここで少し混乱があるようです。私は本当に無限のラインではないラインセグメントを意味します。私が作業しているコードを添付しました。私が修正したこのコードは、もともと上記のリンクされたスレッドのコメントの一部として書かれており、元の著者Peter Karasevはそれに価値があると付け加えたいと思います。つまり、コードは2Dで動作し、3D(vz、uz、およびlenSqr)にするための3行目のコメントがあります。私の具体的な質問は、私は実際に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

これまでに3Dで何を試しましたか?このサイトはコード作成サービスではありません。あなたのコードを示して、あなたが持っている特定の問題を記述してください。あなたの問題(2つのポイントで定義されたラインを意味すると仮定)は非常に簡単な数式を含む[ここでMathWorldで完全に説明されています](http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html)です。 – horchler

+0

http:// stackoverflow。com/questions/43207514/works for 2d and 3d – MBo

+0

ご返信ありがとうございます。リクエストした情報が追加されました。 – 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上の任意の点Xtのいくつかの値について

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) 

だから、あなただけの第三、私はここに投稿したと私はミスを犯していない場合、あなたが行ってもいいですコードの5行目を使用する必要があります。

関連する問題