向量的“点积”,也叫内积、点乘,两个向量u和v的点积定义为:
u.v = |u||v|cos(θ)
即两向量长度乘以夹角的余弦。
当u和v垂直时,u.v=0(因为90度角的余弦值为0)
当u和v同向时,则u.v = |u||v|
如果将u(x1, y1)和v(x2, y2)表示为:
u = x1i+y1j
v = x2i+y2j
期中i和j表示横轴和纵轴单位向量。
则u.v = (x1i+y1j).(x2i+y2j)=x1x2+y1y2
因此两向量的内积为相应坐标乘积之和,代码如下:
double Dot(Vector a, Vector b)
{
return a.x*b.x + a.y*b.y;
}
从而可以求出两个向量的夹角公式为:
cos(θ) = u.v / (|u||v|)
代码实现如下:
double Length(Vector a)
{
return sqrt(Dot(a, a));
}
double Angle(Vector a, Vector b)
{
return acos(Dot(a, b)/(Length(a)*Length(b)));
}
//测试代码
int main()
{
Vector v1(1, 0), v2(1, 1); //构造函数测试
printf("%.2f\n", Angle(v1, v2));//弧度
printf("%.2f\n", Angle(v1, v2)*180/acos(-1.0)); //角度
return 0;
}