点或向量的表示
struct P{
double x,y;
P(double x=0,double y=0):x(x),y(y){}
};
基本运算
//加
P operator + (P A,P B){
return P(A.x+B.x,A.y+B.y);
}
//减
P operator - (P A,P B){
return P(A.x-B.x,A.y-B.y);
}
//乘
P operator * (P A,double p){
return P(A.x*p,A.y*p);
}
//除
P operator / (P A,double p){
return P(A.x/p,A.y/p);
}
//点积
double Dot(P A,P B){
return A.x*B.x+A.y*B.y;
}
//叉积(大于零表示向量A在向量B的顺时针方向,小于零表示向量A在向量B的逆时针方向,等于零表示两个向量共线)
double Cross(P A,P B){
return A.x*B.y-A.y*B.x;
}
//长度
double Length(P A){
return sqrt(Dot(A,A));
}
//角度
double Angle(P A,P B){
return acos(Dot(A,B)/Length(A)/Length(B));
}