凸包模板

来源:互联网 发布:手机淘宝团购在哪 编辑:程序博客网 时间:2024/06/04 19:39
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());}
0 0
原创粉丝点击