OpenCV 第八章 凸包算法

为了博客内容的衔接,标题命名为“OpenCV 第八章 凸包算法”。

转自:http://blog.csdn.net/foreverlin1204/article/details/6221986?reload

原标题:凸包算法

正文:

其实这个算法是在一年前得某场比赛中临时抱佛脚学的,今天重新的来温习了一遍

如何来理解凸包?一组平面上的点,求一个包含所有点的最小的凸多边形,这就是凸包问题了。这可以形象地想成这样:在地上放置一些不可移动的木桩,用一根绳子把他们尽量紧地圈起来,这就是凸包了,百度百科中的这张图很生动+活泼+形象,所以你懂的

好说完这个我们首先要来了解下极角排序和左转判定

极角排序:就是选取一个最左的点,按y最小,其次x最小来定义,接下来所有的点针对该点的射线,

               按角度由小到大,若相同按距离由近到远来排序

左转判定:这个和叉积有关,对于向量p1(x1,y1),p2(x2,y2)如果x1*y2-x2*y1>0,则从p1到p2左转

 

我学的是Graham算法,那么接下来来介绍下该算法

(1)选取最下左的点P0

(2)计算出每个点相对于P0的角度和距离(利用这个来排序)排序

(3)设点数为n,将p[n-1]和p[0]入栈,判断点集合是否为一条直线(初始k=2表示当前凸包的大小)

(4)i从1到n-1遍历,对于p[k-1],p[k-2],p[i]若满足左转,将p[i]压入栈

        否则i--,k--

(5)k--,返回k表示凸包的点数

 

下面是我写的模板

int Polygon::Graham(Polygon &con){//别用自己做对象 
    int t=0,i;
    Point tmp;
    //先y最小再x最小 
    for(i=1;i<n;i++)if(p[i]<p[t])t=i;
    swap(p[t],p[0]);
    for(i=0;i<n;i++){
        tmp=p[i]-p[0];
        p[i].dis=tmp.Len2();
        p[i].angle=atan2(tmp.y,tmp.x);
        }
    sort(p,p+n,_cmp);
    //for(int i=0;i<n;i++)p[i].out();
    //cout<<"***"<<endl;
    int k=0;
    con.p[k++]=p[n-1];
    con.p[k++]=p[0];
    if(Sig(p[1].angle-p[n-1].angle)==0)con.p[k++]=p[n-1];//凸包为一线段
    else{
        for(i=1;i<n;i++){
            //con[k-1].out();
            //con[k-2].out();
            //p[i].out();             
            if(Sig(Cross(con.p[k-1],con.p[k-2],p[i]))>0)con.p[k++]=p[i];
            else {i--;k--;}
            //cout<<"---"<<endl;
            //for(int j=0;j<k;j++)con[j].out();
            //system("pause");
            }
        }
    return con.n=--k;                    
    }
/*
9
1 4
3 6
5 7
2 2
3 3
5 4
8 3
9 6
7 1
*/
正文结束。


其他有关凸包算法的链接:http://blog.chinaunix.net/uid-12127321-id-2957853.html


由于我之前两篇博客内均没有相关的理论的讲解,为了满足一些爱好学习的朋友,特地转载此博客。

希望大家共勉。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值