向量

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());/*点的垂线在线段上*/
    }
};
posted @ 2022-11-14 17:48  半步蒟蒻  阅读(70)  评论(0)    收藏  举报