凸包算法绪论.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.2 Graham的栈扫描 Graham的扫描是一个很优美的过程 用到的数据结构也很简单 仅仅是一个栈而已 核心的思想是按照排好的序 依次加入新点得到新的边 如果和上一条边成左转关系就压栈继续 如果右转就弹栈直到和栈顶两点的边成左转关系 压栈继续 实现的时候我们不用存边 只需要含顺序在栈里存点 相邻两点就是一条边 由于我们时时刻刻都保证栈内是一个凸壳 所以最后扫描完毕 就得到了一个凸包 这样Graham扫描算法基本完成 下面还是继续上面的那个样例 演示一下栈扫描的过程 代码实现: #includestdio.h #includemath.h #includealgorithm using namespace std; struct Point { double x,y,len; }Pt[20000],Stack[20000],Point_A; double Cross(Point a,Point b,Point c) { return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } double Dis(Point a,Point b) { return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); } void FindPoint(int n) { int i,tempNumber=0; Point tempPoint; Point_A=Pt[0]; for(i=1;in;i++) { if(Pt[i].yPoint_A.y||Pt[i].y==Point_A.yPt[i].xPoint_A.x) { tempNumber=i; Point_A=Pt[i]; } } empPoint=Pt[0]; Pt[0]=Pt[tempNumber]; Pt[tempNumber]=tempPoint; } bool Cmp(Point a,Point b) { double k=Cross(Point_A,a,b); if(k0) return true; if(k0) return false; a.len=Dis(Point_A,a); b.len=Dis(Point_A,b); return a.lenb.len; } void Graham(int n) { int i,top=2; Pt[n]=Pt[0]; Stack[0]=Pt[0]; Stack[1]=Pt[1]; Stack[2]=Pt[2]; for(i=3;i=n;i++) { while(Cross(Stack[top-1],Stack[top],Pt[i])=0top1) top--; Stack[++top]=Pt[i]; } } int main(void) { int i,Num; while(scanf(%d,Num)!=EOF) { for(i=0;iNum;i++) scanf(%lf%lf,Pt[i].x,Pt[i].y); FindPoint(Num); sort(Pt,Pt+Num,Cmp); Graham(Num); } return 0; } 算法描述:    这里描述的Graham算法是经过改进后的算法而不是原始算法,因为改进之后的算法更易于对算法进行编码。 已知有n个点的平面点集p(p[0]~p[n-1]),找到二维平面中最下最左的点,即y坐标最小的点。若有多个y值最小的点,取其中x值最小的点。 以这个最下最左的点作为基准点(即p[0]),对二维平面上的点进行极角排序。 将p[0]、p[1]、p[2]三个点压入栈中(栈用st表示,top表示栈顶指针的位置)。并将p[0]的值赋给p[n]。 循环遍历平面点集p[3]到p[n]。对于每个p[i](3=i=n)若存在p[i]在向量st[top-1]st[top]的顺时针方(包括共线)向且栈顶元素不多于2个时,将栈顶元素出栈,直到p[i]在向量st[top-1]st[top]的逆时针方向或栈中元素个数小于3时将p[i]入栈。 循环结束后,栈st中存储的点正好就是凸包的所有顶点,且这些顶点以逆时针的顺序存储在栈中(st[0]~st[top-1])。 注意:由于第三步中,将p[0]的值赋给了p[

文档评论(0)

武神赵子龙 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档