给定一个点集,凸包是能够包围所有点的最小凸多边形。对于凸包,有以下的主要性质:1)所有顶点均在任何一条凸包边所在直线的一侧。如果逆时针遍历凸包的边,则对每条边,所有点均在其左侧。2)从任一点出发,沿逆时针前进总是向左转,沿顺时针前进总是向右转。
利用凸包的性质来求凸包。首先将点排序,优先按x排序再按y排序。第一个点直接加入,加下来若栈中点数目小于2直接加入;若大于2,则计算新点相对于栈里最上层边的方向,若是右转或同一直线,则将栈中最上层点踢出去继续判断。完善凸包的上半部分,从n开始向前遍历,过程同上。
需要注意的是,要求凸包必须有一个以上的点,否则会RE。求凸包的结果,栈中点是逆时针排列的。
vector<point> convex(point *ps,int n){ sort(ps,ps+n); int k=0; vector<point> qs(2*n); for(int i=0;i<n;i++){ while(k>1&&((qs[k-1]-qs[k-2])^(ps[i]-qs[k-1]))<=0) k--; qs[k++]=ps[i]; } for(int i=n-2,t=k;i>=0;i--){ while(k>t&&((qs[k-1]-qs[k-2])^(ps[i]-qs[k-1]))<=0) k--; qs[k++]=ps[i]; } qs.resize(k-1); return qs; }
标签:ps,qs,逆时针,int,凸包,计算,几何,排序 来源: https://www.cnblogs.com/czrui/p/13786492.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。