文章目录
- 0.引言
- 1.原理
- 2.代码及实用教程
0.引言
\qquad点与多边形的关系无非三种——内部、上、外部。本文定义点在多边形内部距离为负,点在多边形边上距离为0,到多边形外部距离为正。
1.原理
计算点到多边形的距离分为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; % 内部为负elsek = 1; % 外部为正endminD = Inf;for i = 1:size(poly,1)-1 % 边序号D = dis2edge(p,poly(i,:)',poly(i+1,:)');if D < minDminD = D;endendminD = 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<0d = norm(AP); elseif 0<=t && t<=1d = norm(P-t*AB);elsed = norm(BP);endend
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\sqrt22
>> clear
>> poly = [0,0;0,1;1,1;1,0];
>> P = [0.5;0.5];
>> dis2poly(P,poly)ans =-0.5000
点在多边形内部,很显然最短距离为0.5,符号为负。