模板 計算幾何

2022-05-07 22:15:18 字數 3344 閱讀 3254

這個模板的缺點:有很多模板都是非常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...