凸包问题
来源:互联网 发布:创维电视连接有线网络 编辑:程序博客网 时间:2024/05/11 22:50
首先介绍下什么是凸包问题?如下图:
在一个二维坐标系,有若干点杂乱排列着,将最外层的点连接起来构成的凸多边型,它能包含给定的所有的点,这个多边形就是凸包。
寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包。
在讲解之前,读者需要了解向量叉积正负的几何意义,如不了解,可以参考http://blog.csdn.net/laojiu_/article/details/52078675
Graham Scan算法的做法是先定下一个起点,一般是最左边的点和最右边的点,然后一个个点扫过去,如果新加入的点和之前已经找到的点所构成的“壳”凸性没有变化,就继续扫,否则就把已经找到的最后一个点删去,再比较凸性,直到凸性不发生变化。分别扫描上下两个“壳”,合并在一起,凸包就找到了。这么说很抽象,我们看图来解释:
我们找下“壳”,上下其实是一样的。首先加入两个点A和C:
然后插入第三个点G,并计算AC×CG的叉积,却发现叉积小于0,也就是说逆时针方向上∠ACG大于180度,于是删去C点,加入G点:
然后就是依照这个步骤便能加入D点。在AD上方是以D为起点。就能够找到AGD和DFEA两个凸壳。合并就得到了凸包。
关于扫描的顺序,有坐标序和极角序两种。坐标序是比较两个点的x坐标,如果小的先被扫描(扫描上凸壳的时候反过来);如果两个点x坐标相同,那么就比较y坐标,小的先被扫描(扫描上凸壳的时候也是反过来)。极角序使用arctan2函数的返回值进行比较,这个读者自己写吧。
下面贴下代码:
0 0
- 凸包问题
- 凸包问题
- poj2187 凸包问题
- 凸包问题
- ACM -- 凸包问题
- 凸包问题
- 凸包问题
- 凸包问题
- 凸包问题
- 凸包问题
- 凸包问题
- 凸包问题-蛮力法
- 凸包问题
- 凸包问题
- 凸包问题
- 凸包问题
- ACM:凸包问题
- hdu 1392 凸包问题
- Java开发环境搭建
- lightoj 1245 - Harmonic Number (II) (数学思维规律)
- ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)★★
- 学习笔记之前端库/框架
- Filter过滤器
- 凸包问题
- Unity3d的父级与Destory()
- 分治法-归并排序
- Http请求辅助工具HttpClient
- java动态代理例子(Proxy,InvocationHandler)
- HDU 2089 不要62 (数位DP)
- 用Editplus开发HTML
- hdu5000一道很有意思的DP
- 作为人才我们为什么要和几个猎头保持良好的关系?