标签:return Point int double top 面积 const 求凸包 模板
先求凸const int N=1e6;
struct Point { double x,y; double operator ^(const Point &b)const { return x*b.y - y*b.x; } }; Point stackk[N]; //凸包中所有点,下标从0....top开始 Point p[N]; //存入的所有点 Point MinA; int top; double dist(Point A,Point B) { return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); } //计算叉积 判断bc向量到ac向量 是否通过左转得到 >0左转 <0右转 =0共线 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); } bool cmp(Point a,Point b) //极角排序 { double k=cross(MinA,a,b); if(k>0) return 1; if(k<0) return 0; return dist(MinA,a)<dist(MinA,b); } void Graham(int n) { int i; for(i=1; i<n; i++) if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x)) swap(p[i],p[0]); MinA=p[0]; sort(p+1,p+n,cmp); stackk[0]=p[0]; stackk[1]=p[1]; top=1; for(i=2; i<n; i++) { while(cross(stackk[top-1],stackk[top],p[i])<=0&&top>=1) --top; stackk[++top]=p[i]; } top++; } int n,q; double CalcArea(Point p[],int n) { double res = 0; for(int i = 0; i < n; i++) res += (p[i]^p[(i+1)%n])/2.0; return fabs(res); }
标签:return,Point,int,double,top,面积,const,求凸包,模板 来源: https://www.cnblogs.com/liyishui2003/p/16583753.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。