這個模板的缺點:有很多模板都是非常c語言化的,雖然可讀性比較差但是應該效能非常感人。鑑於acm可以開o2所以方向用stl就好了。但是有的地方不好,比如半平面交的排序,對同乙個向量多次判斷傾斜角,其實預處理的時候要是需要,就把傾斜角初始化就好了。
//不要輸出-0.0之類的數
const double eps=1e-8;
const double pi=acos(-1.0);
//判斷浮點數的符號
inline int cmp(double x)
inline double sqr(double x)
struct point ;
point(const double x,const double y):x(x),y(y) {};
friend point operator+(const point &a,const point &b)
friend point operator-(const point &a,const point &b)
friend point operator*(const point &p,const double k)
friend point operator*(const double k,const point &p)
friend point operator/(const point &p,const double k)
friend bool operator==(const point &a,const point &b)
point rotate(double a)
double norm()
};double det(const point &a,const point &b)
double dot(const point &a,const point &b)
double dist(const point &a,const point &b)
struct line ;
line(const point &a,const point &b):a(a),b(b) {};
line move_dist(const double &d)
};double dist_point_to_line(const point &p,const line &l)
point point_project_on_line(const point &p,const line &l)
bool point_on_line(const point &p,const line &l)
bool parallel(const line &tl,const line &l)
bool intersect(const line &tl,const line &l,point &p)
const int maxn=105;
struct polygon ;
double perimeter()
return num!=0;
}
struct polygon_convex
polygon to_polygon()
#define next(i) ((i+1)%n)
for(int i=0,j=1;imaxd)
d=dist(p[next(i)],p[next(j)]);
if(d>maxd)
}#undef next(i)
return maxd;
}};bool comp_less(const point&a,const point &b)
polygon_convex convex_hull(vectora)
int k=m;
for(int i=int(a.size())-2; i>=0; --i)
//當只有乙個點時,凸包保留乙個點,否則結尾和開頭重複了
res.p.resize(m-(a.size()>1));
return res;
}int point_in_polygon_convex(const point &p,const polygon_convex &pc)
else
}r%=n;
int z=cmp(det(p[r]-p,p[l]-p));
//z==0在邊界上,三點共線
//z==1在凸包外
//z==-1在凸包內
return (z+2)%3;
}
強烈建議加上四周圍的inf邊,這樣傳入的v既不會是空的,也不會有相反向量叉積做除法**180度之前會遇到inf邊)。
小心三線共點返回的半平面,有點東西。(好像可以被反向平行檢測掉)
vectorhp;
hp.push_back(halfplane(point(-inf,-inf),point(inf,-inf)));
hp.push_back(halfplane(point(inf,-inf),point(inf,inf)));
hp.push_back(halfplane(point(inf,inf),point(-inf,inf)));
hp.push_back(halfplane(point(-inf,inf),point(-inf,-inf)));
struct halfplane ;
halfplane(point p1,point p2):first(p1),second(p2) {};
};inline int satisfy(point a,halfplane p)
point intersect_point(const halfplane &a,const halfplane &b)
inline bool compare(const halfplane &a,const halfplane &b)
inline bool parallel(const halfplane &a,const halfplane &b)
//半平面交,o(nlogn)
vectorhalfplane_intersection(vectorv)
while(!ans.empty()&&!satisfy(ans.back(),q.front()))
while(!ans.empty()&&!satisfy(ans.front(),q.back()))
ans.push_back(intersect_point(q.back(),q.front()));
return vector(ans.begin(),ans.end());
}
計算幾何模板
sgn返回x經過eps處理的符號,負數返回 1,正數返回1,x的絕對值如果足夠小,就返回0。const double eps 1e 8 int sgn double x double mysqrt double x pt是point的縮寫 int版 struct pt pt int x,int y ...
計算幾何模板
include define vct point using namespace std const double pi atan2 0,1 const double eps 1e 8 int sgn double d struct point bool operator point b const...
計算幾何模板
多圓面積交 typedef long long ll typedef unsigned long long ull typedef vector vi const int inf 0x3f3f3f3f const double eps 1e 10 const int mod 100000007 co...