Loading

计算几何模板

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]));
	}
}
posted @ 2024-08-25 08:39  班级账号  阅读(16)  评论(0)    收藏  举报