凸包寻找算法

凸多边形:一个多边形,如果它的任意两个点的连线都不包括该多边形以外的点,就称为凸多边形。
一个平面点集S的凸包是指包含s的最小凸多边形,该多边形的顶点称为s的极点。
寻找一个平面点集的凸包是计算几何的基本问题,同时在图像处理和统计学中也有应用。
寻找凸包的原理:
假定在S的凸包内部取一个点X,然后从X向下画一条垂直线,也跳垂直线与X和S的第i个点的连线之间
有一个逆时针夹角,称为极角,然后按照极角非递减次序来排列S的点,对于极小相同的点,按照他们
与X的距离从小到大来排列。
从X向下的垂线沿逆时针扫描,按照极角的次序会依次遇到S的极点。如果u,v,w是三个按逆时针排列
的三个连续的极点,那么如果从u到v和从w到v两条连线之间的逆时针夹角大于180度。如果两条连线
之间的夹角小于180度,则第二个点不是极点。
一般选取y最小的点,多个y最小的话,选取其中x最小的点,作为p0,选取好p0后就可以开始选取X了
X不要求是S中的点,是任意的点,一般选在S的中心保证p0是第一个点。
伪代码:
步骤一【处理退化情况】
        如果S的点少于3个,则返回S
        如果S的所有点都在一条直线上,即共线,则计算并返回包含S所有点的最短直线的两个端点。
步骤二:【按极角排序】
        在S的凸包内找到一个点X
        按照极角递增次序来排列S的点,对于极角相同的点,按照它们与X的距离从小到大来排列创建一个
        以S的点为元素,按照上述顺序排列的双向循环链表
        另right指向后继,left指向前驱。
步骤三:【删除非极点的点】
        另p是y坐标最小的点(也可以是x坐标最大的)
        for(x=p,rx=x右边的下一个点;p!=rx)
        {
            rrx=rx右边的点;
            if(x,rx,和rrx的逆时针夹角小于或等于180度)
            {
                从链表中删除rx;
                rx=x;x=rx左边的点;
            }
            else{x=rx;rx=rrx;}
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值