计算几何的模板
2014-08-18 14:50
337 查看
其实还是万能的模板!!!!万岁~
#include<cstdio> #include<cmath> #include<vector> using namespace std; const double eps=1e-8; struct point{ double x,y; point(double x=0,double y=0):x(x),y(y) {}; }; int dcmp(double x) { if(fabs(x)<eps)return 1; if(x>0)return 0; return -1; } point operator +(const point &a,const point &b){ return point(a.x+b.x,a.y+b.y); } point operator -(const point &a,const point &b){ return point(a.x-b.x,a.y-b.y); } point operator *(const point &a,const double p){ return point(a.x*p,a.y*p); } point operator /(const point &a,const double p){ return point(a.x/p,a.y/p); } bool operator < (const point &a,const point &b){ return a.x<b.x||(a.x==b.x&&a.y<b.y); } bool operator ==(const point &a,const point &b) { return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0; } double dot (const point a,const point b) { return a.x*b.x+a.y*b.y; } double len (const point a) { return a.x*a.x+a.y*a.y; } double ang (const point a,const point b) { return acos(dot(a,b)/len(a)/len(b)); } double cross (const point a,const point b) { return a.x*b.y-a.y*b.x; } double area (const point a,const point b,const point c) { return cross(b-a,c-a); } double pointoline(const point p,const point a,const point b) { return fabs(cross(b-a,p-a)/len(b-a)); } double leastoline(const point p,const point a,const point b) { if(a==b) return len(p-a); point v1=b-a,v2=p-a,v3=p-a; if(dcmp(dot(v1,v2))<0) return len(v2); if(dcmp(dot(v1,v3))>0) return len(v3); return fabs(cross(v1,v2))/len(v1); } bool standardcoss(const point a1,const point a2,const point b1,const point b2) { double c1 = cross(a2-a1, b1-a1), c2 = cross(a2-a1, b2-a1),c3 = cross(b2-b1, a1-b1), c4 = cross(b2-b1, a2-b1); return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0; } bool OnSegment(point p,point a1,point a2) { return dcmp(cross(a1-p,a2-p))==0&&dcmp(dot(a1-p,a2-p))<0; //线段包含端点时改成<= } double PolygonArea(vector<point> p) { int n = p.size(); double area = 0; for(int i = 1; i < n-1; i++) area += cross(p[i]-p[0], p[i+1]-p[0]); return area/2; } int isPointinPolygon(point p,vector<point>poly) { int wn=0; int n=poly.size(); for (int i=0;i<n;i++) { if (OnSegment(p,poly[i],poly[(i+1)%n])) return -1; //边界 int k=dcmp(cross(poly[(i+1)%n]-poly[i],p-poly[i])); int d1=dcmp(poly[i].y-p.y); int d2=dcmp(poly[(i+1)%n].y - p.y); if (k>0&&d1<=0&&d2>0) wn++; if (k<0&&d2<=0&&d1>0) wn--; } if (wn!=0) return 1; //内部 return 0; //外部 } point PolyGravity(point *p,int n) { point ans=point(0,0); double sumArea=0,area; for(int i=2;i<n;i++) { area=cross(p[i-1]-p[0],p[i]-p[0]); sumArea+=area; ans.x+=(p[0].x+p[i-1].x+p[i].x)*area; ans.y+=(p[0].y+p[i-1].y+p[i].y)*area; } return ans/(sumArea*3); } int main() { }
相关文章推荐
- 计算几何三维模板
- 计算几何的简单模板
- 【转】计算几何模板
- UVa 11178计算几何 模板题
- 二维计算几何模板--多边形/凸包
- ACM计算几何模板 SPOJ AMR10A Playground
- POJ1113 计算几何--整形凸包模板周长
- 计算几何:点积的模板
- 计算几何模板
- 计算几何模板补充(三维空间体积、平面、直线、向量相关计算。附上hdu4741,求异面直线的最短距离与交点)
- 计算几何模板+[Uva12304] 2D Geometry 110 in 1
- 计算几何模板之二维点线面模板
- 计算几何模板总结(一)
- 求凸包的周长(计算几何模板)
- 计算几何模板(入门级)
- HDU 1086 计算几何 求线段交点(吉大模板)
- 计算几何模板
- 二维几何模板-与圆有关的计算 _long double 版
- 计算几何模板——平面最近点对(附C++源代码) - [转载经典]
- 【计算几何】【计算几何模板】【持续更新】