凸包 你敢更残暴吗?
来源:互联网 发布:战舰少女r数据无法登录 编辑:程序博客网 时间:2024/04/28 19:53
在学习了一些有关计算机几何的基础知识和一些基本工具之后要快速的解决一些简单的几何问题,如两点之间的距离、两线段的交点个数等等是可以轻松应付的,但是对于复杂点的几何问题,我们还是要有更好的算法,这样才可以更高效的解决它。在这一篇中来总结 平面凸包 的 Graham算法;http://www.cnblogs.com/jbelial/
平面凸包 :
定义: 对一个简单多边形来说,如果给定其边界上或内部的任意两个点,连接这两个点的线段上的所有点都被包含在该多边形的边界上或内部的话,则该多边形为凸多边形 。
在解决平面凸包下面介绍了两种算法:
一、 Graham扫描法,运行时间为O(nlgn)。
二、 Jarvis步进法,运行时间为O(nh),h为凸包中的顶点数。
Graham扫描法
基本思想:通过设置一个关于候选点的堆栈s来解决凸包问题。
操作:输入集合Q中的每一个点都被压入栈一次,非CH(Q)(表示Q的凸包)中的顶点的点最终将被弹出堆栈,当算法终止时,堆栈S中仅包含CH(Q)中的顶点,其顺序为个各顶点在边界上出现的逆时针方向排列的顺序。
注:下列过程要求|Q|>=3,它调用函数TOP(S)返回处于堆栈S 顶部的点,并调用函数NEXT-TO –TOP(S)返回处于堆栈顶部下面的那个点。但不改变堆栈的结构。
GRAHAM-SCAN(Q)
1 设P0 是Q 中Y 坐标最小的点,如果有多个这样的点则取最左边的点作为P0;
2 设<P1,P2,……,Pm>是Q 中剩余的点,对其按逆时针方向相对P0 的极角进行排序,如果有数个点有相同的极角,则去掉其余的点,只留下一个与P0 距离最远的那个点;
3 PUSH(p0 , S)
4 PUSH(p1 , S)
5 PUSH(p3 , S)
6 for i ← 3 to m
7 do while 由点NEXT-TOP-TOP(S),TOP(S)和Pi 所形成的角形成一次非左转
8 do POP(S)
9 PUSH(pi , S)
10 return S
首先,找一个凸包上的点,把这个点放到第一个点的位置P0。然后把P1~Pm 按照P0Pi的方向排序,可以用矢量积(叉积)判定。
做好了预处理后开始对堆栈中的点<p3,p4,...,pm>中的每一个点进行迭代,在第7到8行的while循环把发现不是凸包中的顶点的点从堆栈中移去。(原理:沿逆时针方向通过凸包时,在每个顶点处应该向左转。因此,while循环每次发现在一个顶点处没有向左转时,就把该顶点从堆栈中弹出。)当算法向点pi推进、在已经弹出所有非左转的顶点后,就把pi压入堆栈中。
举例如下:
练习:HDU 1392 Surround the Trees
模板:http://www.cnblogs.com/jbelial/archive/2011/08/05/2128624.html
- 凸包 你敢更残暴吗?
- 私奔!你敢吗?
- 全力以赴,你敢吗
- 技术人员创业,你敢吗?
- 总统巴黎公开呛普京:我敢辞职你敢吗?
- SEO,你敢说你会吗?
- 【原创】向黑客挑衅,你敢吗?
- 你敢面对这样的现实吗?
- 你敢跟老板说“不”吗?
- 将来的你 敢生病吗?
- 谷歌面试题,你敢回答吗。
- 周鸿祎的葵花宝典你敢照学吗?
- 这行代码你敢试试吗
- 你敢说你热爱编程,你热爱学习吗?
- 你敢写下你最爱人的名字吗?
- 你敢说你真的懂微信营销吗? 转载
- 反射(类!我叫你,你敢答应吗)
- 跟你的敌人握手,你敢吗
- 关于Android 输入框 隐藏
- wordpress+000webhost+dot.tk 搭建免费独立博客
- Python中yield的使用小述
- 树形结构的处理——组合模式
- typedef的使用
- 凸包 你敢更残暴吗?
- HDU-4971-A simple brute force problem.
- 单击 numberfield后,如失去焦点后非数字部分消失问题的解决办法
- Android 解决Map根据地址返回经纬度方法getFromLocationName()不能正常执行
- 能改变孩子一生的4个问题
- 第九章 9.3.2节练习 & 9.3.3节练习
- 如何查看sharepoint2013内所有的网站模板
- MySQL添加外键失败ERROR 1452的解决
- hdu Fibonacci