首页 文章

线段与三维点之间的最短距离(3D)

提问于
浏览
0

我一直在MATLAB中构建一个程序,这个程序描述了如何在2D中找到点和线段之间的最短距离(Shortest distance between a point and a line segment) . 我需要一个与之前回答的问题基本相同的功能,但是在3D而不是2D和MATLAB中 .

这个上一篇文章的答案的最高评论都没有在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

2 回答

  • 1

    只需将 ABP 定义为列向量即可 . 然后 AB 行上的任何一点 X 都有表格

    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)
    

    所以你只需要使用我在这里发布的第三行和第五行代码,如果我没有弄错,你就可以去了 .

  • 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
    

相关问题