1

私は、点と線分の間の最短距離を2Dで見つける方法を説明する優れたスレッドからMATLABでプログラムを構築しています(点と線分の間の最短距離)。この以前に回答された質問と本質的に同じことを行う関数が必要ですが、2D ではなく 3D と MATLAB で行われます。

この以前の投稿への回答に対するトップ コメントは MATLAB にはありません。そのため、このコードの舞台裏で何が起こっているのかを理解するのに苦労しています。これを 3D MATLAB コードに変換するのを手伝ってくれる人がいるかもしれません。

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

編集: ここには少し混乱があるようです。私は本当に、無限の線ではなく、線分を意味します。私が作業しているコードを添付しました。私が修正したこのコードは、もともと上記のリンクされたスレッドのコメントの一部として書かれたものであり、元の作者であるピーター・カラセフはその功績に値することを付け加えたいと思います。このままでは、コードは 2D で動作し、3D にするための開始点である 3 行 (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
4

3 に答える 3

4

ABPを列ベクトルとして定義するだけです。次にX、線上の任意の点ABは次の形式を持ちます

X = A+t*(B-A)

の値に対してt

そして確かに、線は線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)

したがって、ここに投稿した 3 行目と 5 行目のコードを使用するだけでよく、間違いがなければ問題ありません。

于 2017-04-11T21:38:02.430 に答える