const double eps=1e-8;
const double pi=acos(-1.0);
//计算几何误差修正
//输入为一个double类型的数,返回-1表示负数,1表示正数,0表示x为0
int cmp(double x){
if(fabs(x)<eps)
return 0;
if(x>0) return 1;
return -1;
}
//计算几何点类
inline double sqr(double x){
return x*x;
}
struct point{
double x,y;
point(){}
point(double a,double b):x(a),y(b){}
void input(){
scanf("%lf%lf",&x,&y);
}
//加法
friend point operator + (const point &a,const point &b){
return point(a.x+b.x,a.y+b.y);
}
//减法
friend point operator - (const point &a,const point &b){
return point(a.x-b.x,a.y-b.y);
}
//判断相等
friend bool operator == (const point &a,const point &b){
return cmp(a.x-b.x)==0&&cmp(a.y-b.y)==0;
}
//倍增
friend point operator * (const point &a,const double &b){
return point(a.x*b,a.y*b);
}
//除法
friend point operator / (const point &a,const double b){
return point(a.x/b,a.y/b);
}
//模长
double norm(){
return sqrt(sqrt(x)+sqr(y));
}
};
//叉积,a×b>0代表a在b的顺时针方向,<0代表a在b的逆时针方向,等于0代表a和b向量共线,但不确定方向是否相同
double det(const point &a,const point &b){
return a.x*b.y-a.y*b.x;
}
//点积
double dot(const point &a,const point &b){
return a.x*b.x+a.y*b.y;
}
//距离
double dist(const point &a,const point &b){
return (a-b).norm();
}
//op向量绕原点逆时针旋转A(弧度)
point rotate_point(const point &p,double A){
double tx=p.x,ty=p.y;
return point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));
}
计算几何模板——点类
最新推荐文章于 2019-03-14 13:25:00 发布