在图像处理过程中,有时需要对多边形的顶点按照顺时针或者逆时针顺序进行排序。下面给大家简单说明一下我的解决思路及方法。
1.建立新的坐标系,使得新的坐标系的原点在多边形的内部。这样是为了让各个顶点坐标可以按照向量的方法去处理,为下一步向量叉乘做铺垫。如下图所示。
2.将新坐标点存起来,作为向量。两个向量叉乘的结果作为判断顺、逆的依据。例如you 两个向量a和b. a×b<0—>a在b的逆时针方向,a×b>0—>a在b的顺时针方向。
3.用上一步的方法进行冒泡排序,确定各个顶点的顺序。
此方法所能适用的多边形应该尽量是凸多边形,因为如果是凹多边形则有可能将新坐标系原点设置在多边形之外,从而造成错误的排列,具体原因请读者看完后自行推敲。
函数代码
function [ output_F ] = PointSort( input_F,flag )
%此函数用于给多边形的顶点按顺时针或者逆时针排序
%输入input_F为未排序的多边形顶点数组,flag为顺/逆时针排序的标志,当flag=1时为逆时针排序,其它情况为顺时针
%输出output_F为排完序后的顶点数组
%%%建立新的坐标系,确定坐标向量
center_x=round(mean(input_F(:,1)));
center_y=round(mean(input_F(:,2)));%通过计算所有点横纵坐标的平均值,近似计算出多边形的质心
input_F(:,1)=input_F(:,1)-center_x;
input_F(:,2)=input_F(:,2)-center_y;%以质心为原点建立坐标系,此时input_F中存储的是向量
input_F=[input_F;input_F(1,:)];%将input_F的第一行加到最后,是为了方便下一步input_F首尾向量之间的叉乘
%%%冒泡排序法排序
if(flag==1)
for i=1:(length(input_F(:,1))-1)
for j=1:(length(input_F(:,1))-i)
num=(input_F(j,1)*input_F(j+1,2)-input_F(j,2)*input_F(j+1,1));%计算两个向量叉乘
if num>0
input_F([j,j+1],:)=input_F([j+1,j],:);
end
end
end
else
for i=1:(length(input_F(:,1))-1)
for j=1:(length(input_F(:,1))-i)
num=(input_F(j,1)*input_F(j+1,2)-input_F(j,2)*input_F(j+1,1));%计算两个向量叉乘
if num<0
input_F([j,j+1],:)=input_F([j+1,j],:);
end
end
end
end
input_F=unique(input_F,'rows','stable');%删掉重复的行(注意:unique默认是sort所以此处要特别加上stable)
output_F(:,1)=input_F(:,1)+center_x;
output_F(:,2)=input_F(:,2)+center_y;%恢复到之前的坐标系
end
测试程序
test_data=[-2,3;2,-1;1,1;-1,-1;-0.5,0];
sort_data=PointSort(test_data,2);
测试结果