飞道的博客

【MATLAB】求点到多边形的最短距离

385人阅读  评论(0)

0.引言

\qquad 点与多边形的关系无非三种——内部、上、外部。本文定义点在多边形内部距离为负,点在多边形边上距离为0,到多边形外部距离为正。点在多边形内部

1.原理

计算点到多边形的距离分为3个步骤:

  1. 判断点与多边形的关系
  2. 计算点到多边形每条边的最短距离
  3. 得到最终的距离标量(含符号)

由于以下链接已经讲解地非常完美,本文不再摘录:
求点到多边形的距离
需要提醒读者的是,该文中存在部分笔误的情况(但原理部分比较通俗易懂),例如

蓝线处应为d[0]-a[0],d[1]-a[0]

2.代码及实用教程

function minD = dis2poly(p,poly)
% 计算点p到多边形poly的最短距离
% poly的每一行都是一条边
    if inpolygon(p(1),p(2),poly(:,1),poly(:,2))
        k = -1; % 内部为负
    else
        k = 1;  % 外部为正
    end
    minD = Inf;
    for i = 1:size(poly,1)-1  % 边序号
        D = dis2edge(p,poly(i,:)',poly(i+1,:)');
        if D < minD
            minD = D;
        end
    end
    minD = k*minD;
    function d = dis2edge(P,A,B)
       % P为计算点,A、B为边的两个顶点 
       % 三者均为列向量
       AB = B-A;
       AP = P-A;
       BP = P-B;
       t = (AB'*AP)/(AB'*AB);
       if t<0
           d = norm(AP); 
       elseif 0<=t && t<=1
           d = norm(P-t*AB);
       else
           d = norm(BP);
       end
    end
end

\qquad 输入多边形时,需要多边形是封闭的(即第一个点与最后一个点相同),否则MATLAB的判定点是否在多边形内部的函数inpolygon会返回意料之外的结果。以下是2个计算示例:

>> clear
>> poly = [0,0;0,1;1,1;1,0];
>> P = [2;2];
>> dis2poly(P,poly)

ans =

     1.4142


从上图也可以看出显然最短距离是 2 \sqrt2 2

>> clear
>> poly = [0,0;0,1;1,1;1,0];
>> P = [0.5;0.5];
>> dis2poly(P,poly)

ans =

     -0.5000


点在多边形内部,很显然最短距离为0.5,符号为负。


转载:https://blog.csdn.net/weixin_44044411/article/details/116351634
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场