基于MATLAB的多边形顶点排序方法

        在图像处理过程中,有时需要对多边形的顶点按照顺时针或者逆时针顺序进行排序。下面给大家简单说明一下我的解决思路及方法。

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);

测试结果

                              

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值