计算几何模板
https://www.cnblogs.com/oneway10101/p/17642080.html
const double eps=1e-8;
const double PI=acos(-1.0);
int sgn(double x) {
if(fabs(x)<eps) return 0;
return x>0?1:-1;
}
struct Point{
double x,y;
Point(){}
Point(double x_,double y_):x(x_),y(y_) {}
Point operator +(const Point b) const{
return Point(x+b.x,y+b.y);
}
Point operator -(const Point b) const{
return Point(x-b.x,y-b.y);
}
double operator ^(const Point b) const{
return x*b.y-y*b.x;
}
double operator *(const Point b) const {
return x*b.x+y*b.y;
}
Point operator *(const double b) const {
return Point(x*b,y*b);
}
Point operator /(const double b) const {
return Point(x/b,y/b);
}
bool operator ==(const Point b) const {
return sgn(x-b.x)==0&&sgn(y-b.y)==0;
}
bool operator !=(const Point b) const {
return sgn(x-b.x)!=0||sgn(y-b.y)!=0;
}
};
double dis(Point x) {
return sqrt(x.x*x.x+x.y*x.y);
}
凸包
for(int i=1;i<=n;i++)
if(a[i].y<a[1].y||(a[i].y==a[1].y&&a[i].x<a[1].x))
swap(a[1],a[i]);
sort(a+2,a+n+1,[&](const Point x,const Point y) {
int t=sgn((x-a[1])^(y-a[1]));
if(t>0) return true;
else if(t<0) return false;
else return dis(x-a[1])<dis(y-a[1]);
});
stk[++tp]=a[1];
for(int i=2;i<=n;i++) {
while(tp>1&&((stk[tp]-stk[tp-1])^(a[i]-stk[tp-1]))<=0) tp--;
stk[++tp]=a[i];
}
旋转卡壳
//先求一遍凸包
for(int i=1;i<=tp;i++)
stk[i+tp]=stk[i];
int p=2; ll res=0;
for(int i=1;i<=tp;i++) {
res=max(res,dis(stk[i]-stk[p]));
while(p+1<i+tp&&((stk[i]-stk[i+1])^(stk[p+1]-stk[p]))<=0) {
p++;
res=max(res,dis(stk[i]-stk[p]));
}
}

浙公网安备 33010602011771号