凸包的判定及将凸包中的点逆时针存在数组中
来源:互联网 发布:淘宝衣服检测 编辑:程序博客网 时间:2024/06/05 14:46
数据结构:
struct Point { double x; double y; Point(double a = 0, double b = 0) : x(a), y(b) {} friend bool operator < (const Point &l, const Point &r) {//以y为第一优先级,x为第二优先级 return l.y < r.y || (l.y == r.y && l.x < r.x); } } p[MAXN];
判断凸包:
double mult(const Point &a, const Point &b, const Point &o) { return (a.x - o.x) * (b.y - o.y) >= (b.x - o.x) * (a.y - o.y);//b到o的斜率大于a到o的斜率 }
int Graham(Point *p,int n,Point* Set)//p为点集(从1开始一共有n个)set为逆时针以最左下开始的构成凸包的点集,返回值是构成凸包的点的个数 { sort(p+1,p+n+1); int head; if (n<3) return 0; Set[1]=p[1];Set[2]=p[2]; head=2; for (int k=3;k<=n;k++) { while(head!=1) if (mult(p[k],Set[head],Set[head-1])) head--; else break; Set[++head]=p[k]; } int len=head; Set[++head]=p[n-1]; for (int k=n-2;k>=1;k--) { while(head!=len) if (mult(p[k],Set[head],Set[head-1])) head--; else break; Set[++head]=p[k]; } return --head; }
为什么要判两遍呢,其实我们可以看看排序算法
我们的p[0]其实是左下的一个点,然后p[n-1]其实是右上的一个点
我们正着来一遍的话就只是逆时针从左下到右上点做了一个凸包,接下来还要从右上到左上做一个凸包,这才能算是完整的凸包
同时我们可以看到,我们起点入队了两次,所以咱们最后要return --head;
阅读全文
0 0
- 凸包的判定及将凸包中的点逆时针存在数组中
- 判定数组中是否存在重复元素
- 三角形顺时针和逆时针的判定
- nyist68 三角形顺时针和逆时针的判定
- 三角形顺时针和逆时针的判定
- 三角形顺时针和逆时针的判定
- Java判定数组或集合中是否存在某元素
- 凸包的判定(模板)
- POJ 2007 || Scrambled Polygon(逆时针输出凸包顶点,以原点为起始点
- 如何判定图像中三点的顺时针或逆时针顺序
- POJ 1264 构建凸包判定点求面积
- poj2007凸包graham逆时针输出
- 如何判定数组是否存在重复元素
- 判定两线顺时针方向/逆时针
- 怎样对平面中的点进行顺时针或者逆时针排序
- Appnium各种查找元素的封装及保存截图及判定元素是否存在
- linux中判定远程目录是否存在
- 如何将存在maven仓库中的jar包加载到JBoss的环境中
- 欢迎使用CSDN-markdown编辑器
- php Thinkphp结合composer实现smtp发送邮件
- 155. Min Stack(栈)
- DP 长寿花
- 高德地图api在android studio的实现
- 凸包的判定及将凸包中的点逆时针存在数组中
- 韦东山_数码相册程序_解析
- usaco
- tomcat启动报错:Multiple Contexts have a path of XXX.
- 【LeetCode】二叉树的所有路径
- 6.prototype属性
- 2017年10月小感
- 第四章:列表
- 链队实现