struct Vector{
double x,y;
const double pi=acos(-1),eps=1e-10;
inline Vector(double a=0,double b=0):x(a),y(b){}
inline Vector operator=(Vector a){
return Vector(a.x,a.y);
}
inline bool operator==(Vector a){
return fabs(x-a.x)<eps&&fabs(y-a.y)<eps;
}
inline friend Vector operator+(Vector a,Vector b){
return Vector(a.x+b.x,a.y+b.y);
}
inline friend Vector operator-(Vector a,Vector b){
return Vector(a.x-b.x,a.y-b.y);
}
inline friend Vector operator*(Vector a,double b){
return Vector(a.x*b,a.y*b);
}
inline friend Vector operator/(Vector a,double b){
return Vector(a.x/b,a.y/b);
}
inline Vector rotate(double a){/*绕原点逆时针旋转弧度a*/
return Vector(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a));
}
inline friend double dot(Vector a,Vector b){/*a垂直b则点积为0*/
return a.x*b.x+a.y*b.y;
}
inline friend double cross(Vector a,Vector b){/*a平行b则叉积为0*/
return a.x*b.y-a.y*b.x;
}
inline double length(){
return sqrt(x*x+y*y);
}
inline double radian(){/*弧度*/
return atan2(y,x);
}
inline double angle(){/*角度*/
return 180.0*atan2(y,x)/pi;
}
inline double slope(){/*斜率*/
return y/x;
}
inline double pointdis(Vector a){/*点点距*/
return ((*this)-a).length();
}
inline int cmp(double x){/*判断符号*/
return (fabs(x)<eps)?0:((x<0)?-1:1);
}
inline double segdis(Vector a,Vector b){/*点到线段距离*/
Vector ab=b-a,ap=*this-a,bp=*this-b;
if(cmp(dot(ab,ap))<0)return ap.length();/*垂线在端点a的外部,距离就是ap的距离*/
if(cmp(dot(ab,bp))>0)return bp.length();/*垂线在端点b的外部,距离就是bp的距离*/
return fabs(cross(ab,ap)/ab.length());/*点的垂线在线段上*/
}
};