typedef double flt;
const flt eps = 1e-12, INF = 1e18, PI = acos(-1.0);
flt sqr(flt x) {return x * x;}
int sgn(flt x) {return x<-eps?-1:(x>eps);}
flt fix(flt x) {return sgn(x)==0?0:x;}
struct Point {
flt x, y;
Point(flt a=0, flt b=0) : x(a), y(b) {}
bool operator < (const Point &r) const {
return sgn(x-r.x)<0||(sgn(x-r.x)==0&&sgn(y-r.y)<0);
}
bool operator == (const Point &r) const {
return sgn(x-r.x)==0&&sgn(y-r.y)==0;
}
Point operator *(const flt &k) const {return Point(x*k,y*k);}
Point operator /(const flt &k) const {return Point(x/k,y/k);}
Point operator -(const Point &r) const {return Point(x-r.x,y-r.y);}
Point operator +(const Point &r) const {return Point(x+r.x,y+r.y);}
flt dot(const Point &r) {return x*r.x+y*r.y;}
flt det(const Point &r) {return x*r.y-y*r.x;}
flt sqr() {return x*x+y*y;}
flt abs() {return hypot(x, y);}
Point rot() {return Point(-y,x);}
Point rot(flt A) {return Point(x*cos(A)-y*sin(A),x*sin(A)+y*cos(A));}
Point trunc(flt a=1.0) {return (*this)*(a/this->abs());}
};
vector<Point> convex_hull(vector<Point> u) {
sort(u.begin(), u.end());
u.erase(unique(u.begin(), u.end()), u.end());
if (u.size()<3u) return u;
vector<Point> ret;
for (size_t i=0,o=1,m=1;~i;i+=o) {
while (ret.size()>m) {
Point A=ret.back()-ret[ret.size()-2],B=ret.back()-u[i];
if (A.det(B)<0) break;
ret.pop_back();
}
ret.push_back(u[i]);
if (i+1==u.size()) m=ret.size(),o=-1;
}
ret.pop_back(); return ret;
}
flt dis(Point A, Point B, Point O) {
return fabs((O-A).det(B-A)/(A-B).abs());
}
凸包模板
最新推荐文章于 2023-12-02 16:55:27 发布