计算两个多边形的最近距离(MATLAB)

        本文意在介绍关于计算两组坐标点的最近距离的简单方法,可用此方法来计算两个多边形的最近距离以及距离最近的两个点。下面展示具体实例。

函数代码

function [ point1,point2,dis ] = Mindistance( F1,F2 )
%此函数为计算两组坐标点之间的最近距离并找出距离最近的一对坐标点
%输入分别为两组坐标点的二维数组,必须是n行两列
max_x1=max(F1(:,1));max_x2=max(F2(:,1));
max_y1=max(F1(:,2));max_y2=max(F2(:,2));
max_x=max(max_x1,max_x2);
max_y=max(max_y1,max_y2);
img1_1=zeros(max_x,max_y);%建立一个二值图像使两数组中的点都可以出现在该图中
img2_1=img1_1;
%让数组F1,F2中的坐标点各自显现在两个二值图像中
for i0=1:length(F1(:,1))
    img1_1(F1(i0,1),F1(i0,2))=1;
end
for i1=1:length(F2(:,1))
    img2_1(F2(i1,1),F2(i1,2))=1;
end

[img1_2,dix] = bwdist(img1_1);%dix反映img1_1每个黑点对应的最近的白点的索引下标
img2_2=img2_1.*img1_2;%img2_2中不为0的点表示img2_1中该点到img1_1中点的最近距离
dis=min(img2_2(img2_2~=0));%找到两个数组中的点的最近距离
[x1,y1]=find(img2_2==dis);%找出F2中距离F1最近的点的坐标
L=length(x1);
point1=[L,2];
point2=cat(2,x1,y1);%设置point1,point2数组,记录两组坐标点中距离最近的点的坐标

for i=1:L
  num=dix(x1(i),y1(i));
  [x,y]=ind2sub([max_x,max_y], num); %来完成下标到索引值的转换。
  point1(i,1)=x;
  point1(i,2)=y;      
end

end

        该函数可以比较快速的计算两组坐标点之间的最小距离,并返回相应的坐标。缺点是只能计算整数坐标值,且坐标值需大于0。

测试程序

clc
 img1=zeros(20,20);%首先生成一个20×20像素的二值图像
for i=8:15
    for j=8:i
        img1(i,j)=1;
    end
end
img1(16,9)=1;
img1(17,9)=1;
img1(18,9)=1;
img1(18,10)=1;%在二值图像中随意设计一个多边形区域
[x1,y1]=find(img1==1);
f1=cat(2,x1,y1);
%再生成衣服同样大小的二值图像,里面同样包含一个二值多边形区域
img2=zeros(20,20);
img2(2,1)=1;
img2(2,2)=1;
img2(3,1)=1;
img2(3,2)=1;
img2(3,3)=1;
[x2,y2]=find(img2==1);
f2=cat(2,x2,y2);
[ point1,point2,dis ] = Mindistance( f1,f2 );%调用函数计算两个多边形的最小距离
figure(1)
imshow(img1|img2)%在一幅画面中显示两个多边形
hold on
plot(point1(:,2),point1(:,1),'*')
plot(point2(:,2),point2(:,1),'*')
tip=mean(cat(1,point1,point2));
text(tip(2),tip(1),num2str(dis),'color','b','FontSize',12,'HorizontalAlignment','center');%标记距离
hold off

测试结果

 从图中可以看到两个距离最近的坐标点及两点间的距离。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值