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; % 内部为负
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
查看评论