Graham算法(计算凸包周长)
来源:互联网 发布:电路分析仿真软件 编辑:程序博客网 时间:2024/06/05 04:35
struct Point { double x,y; }; Point point[1003]; Point stack[1003];//把构成凸包的点存到stack中,存入点的个数为top个 int c,n,top; double l,r; int multi(Point p0,Point p1,Point p2) { return ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y)); } double dis(Point p1,Point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } int cmp(Point a,Point b) { if(multi(point[0],a,b)>0) return 1; if(multi(point[0],a,b)<0) return 0; if(dis(point[0],a)<dis(point[0],b)) return 1; return 0; } void graham() { int i,k=0; Point temp; for(i=1; i<n; i++) if((point[i].y<point[k].y)||((point[i].y==point[k].y)&&(point[i].x<point[k].x))) k=i; temp=point[0]; point[0]=point[k]; point[k]=temp; sort(point+1,point+n,cmp);//按极角的大小进行排序 stack[0]=point[0]; stack[1]=point[1]; top=1; i=2; while(i<n) { if(multi(stack[top],stack[top-1],point[i])<=0)//AB x AC>0 AC在AB的逆时针方向 //AB x AC<0 AC在AB的顺时针方向 //AB x AC=0 ABC 共线 stack[++top]=point[i++]; else top--; } }
以上为网上找模板,
我对这个算法的理解是,核心在于判断左右拐,而在判断前要做一些准备工作。
首先要有一个记录点顺序的结构和记录输入的结构【例如数组】,然后讲点对都记录下来了以后,
1.首先找到最左下角的那个顶点(x最小,y最小或与第二小的点相等)
2.把这个点和记录输入的第一个点交换,把输入的第一个点放到最后去。
3.进行排序.
4.根据向量外积大于零或者小于零判断左拐或者右拐,用栈或者数组来完成记录点或者删除点的工作。(需要预先读入两个点)。
算法到此结束,最后将点对输出和距离和即可。
0 0
- Graham算法(计算凸包周长)
- HDU1392 凸包问题求周长 + 裸 + Graham算法
- Javrvis算法计算凸包的周长
- 凸包 graham 算法
- 凸包 graham 算法
- 凸包 graham 算法
- poj1113(凸包Graham算法)
- poj1113Wall(凸包周长计算)
- HDOJ 1392 Surround the Trees【凸包周长 Graham扫描】
- 凸包-Graham Scan算法
- 凸包(graham算法)--转载
- 二维凸包 Graham 算法
- 凸包-Graham-Scan算法
- Graham Scan凸包算法
- Graham凸包算法简介
- 凸包算法(Graham算法)实现,带图形
- POJ1113 凸包周长计算
- 计算几何 graham 最大凸包
- 解决yum升级的问题“There was a problem importing one of the Python modules”
- 20140530资料收集
- CSS操作
- leetcode12.wordBreak
- SQL与Excel的数据互通导入导出
- Graham算法(计算凸包周长)
- 8 Things Programmers Can Do at Weekends
- 生活依然还要继续
- CF 86D Powerful array 【分块算法,n*sqrt(n)】
- android acra错误日志上报
- 音频编解码·实战篇(1)PCM转至AAC(AAC编码)
- oracle
- tomcat下面web应用发布路径配置( 即虚拟目录配置 )
- poj 3155 Hard Life 分数规划+最大权闭合图