2017-04-11 259 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) 

所以,你只需要使用第三和我已经张贴在这里的代码的第五行,如果我没有弄错,你是好去。

相关问题