本文意在介绍关于计算两组坐标点的最近距离的简单方法,可用此方法来计算两个多边形的最近距离以及距离最近的两个点。下面展示具体实例。
函数代码
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
测试结果
文章来源:https://www.toymoban.com/news/detail-720592.html
从图中可以看到两个距离最近的坐标点及两点间的距离。文章来源地址https://www.toymoban.com/news/detail-720592.html
到了这里,关于计算两个多边形的最近距离(MATLAB)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!