向量的点积

2019-04-13 21:30发布

点积或点乘(Dot Product)

设向量a(x1,y1),向量b(x2,y2),二者的夹角θ,二者点乘的结果 d。 将两个向量的每个分量对应相乘,然后将乘积结果相加,得出的结果,即:
d = x1*x2 + y1*y2;
向量的点击运算的结果是一个标量。 几何意义:
d > 0, θ < 90,点积值d大于0,夹角θ小于90度;
d < 0, θ > 90,点积值d小于0,夹角θ大于90度;
d = 0, θ = 90,点积值d等于0,夹角θ等于90度。
可以通过两个向量的点积来判断两个向量之间的夹角情况:
cosθ = dot(a,b)


推导cosθ = dot(a,b)
首先从三角形余弦定理的推导开始,为后面的推导做基础准备。
三角形的三个顶点:
A(ax,ay,az),B(bx,by,bz),C(cx,cy,cz)
向量:
AC(cx-ax,cy-ay,cz-az)
AB(bx-ax,by-ay,bz-az)
BC(cx-bx,cy-by,cz-bz)
设三角形ABC:
角α是向量AB,AC的夹角
角β是向量BC,BA的夹角
角γ是向量CA,CB的夹角
三角形的三条边分别为: a,b,c(即三条向量的模长|AC|=b,|AB|=c,|BC|=a)
在c上做高 d,这条高d将c边一分为二,设高d与边c的交点为D,则:
cos(α)=|AD|/|AC|;
cos(β)=|BD|/|BC|;
由于
c = |AD|+|BD|
|AD|=cos(α)*|AC|=cos(α)*b
|BD|=cos(β)*|BC|=cos(β)*a
所以
c =cos(β)*a+cos(α)*b;
将等式两边均乘以c,得到:
c^2 = ac*cos(β)+bc*cos(α)(1)
以上同样步骤,可以得到:
a^2 = ac*cos(β)+ab*cos(γ)
b^2 = bc*cos(α)+ab*cos(γ)
将上面两式相加,得到:
a^2 + b^2 = ac*cos(β) + ab*cos(γ) + bc*cos(α) + ab*cos(γ)
= [ ac*cos(β) + bc*cos(α)]+[ab*cos(γ) + ab*cos(γ)]
结合(1),推导出:
a^2 + b^2 = c^2 + 2ab*cos(γ)
c^2 = a^2 + b^2 -2ab*cos(γ)
同理,可以推导出:
a^2 = b^2 + c^2 -2bc*cos(α)(2)
b^2 = a^2 + c^2 -2ac*cos(β)

在三角形中ABC中,向量AB的模长是c;向量AC的模长是b;向量BC的模长是a。
|AB| = c
|AC| = b |BC| = a

注:向量的模长:向量的每个分量的平方和再开方,即:
|BC| = sqrt[(cx-bx)*(cx-bx)+(cy-by)*(cy-by)+(cz-bz)*(cz-bz)] 
则:
|BC|^2 =(cx-bx)*(cx-bx)+(cy-by)*(cy-by)+(cz-bz)*(cz-bz)
由此推导出:
a^2 = |BC|^2 = BC*BC(3)
因为向量:
BC = AC-AB(4)
所以:
|BC|^2 = (AC-AB)*(AC-AB)
|BC|^2 = AC*AC+AB*AB-2*AB*AC
|BC|^2 = |AC|^2 + |AB|^2 - 2*AB*AC(5)
结合上面的推导(3):
(2) = (5)
即:
|BC|^2 = |AC|^2 + |AB|^2 - 2*|AB|*|AC|*cos(α)
得:
|AB|*|AC|*cos(α) = (|AC|^2 +|AB|^2 - |BC|^2)/2
(4)代入,得:
|AB*|AC|*cos(α) = (|AC|^2+|AB|^2-|(AC-AB)|^2)/2
将向量AC(cx-ax,cy-ay,cz-az),AB(bx-ax,by-ay,bz-az),BC(cx-bx,cy-by,cz-bz)代入:
|AB*|AC|*cos(α) ={(cx-ax)^2+(cy-ay)^2+(cz-az)^2+(bx-ax)^2+(by-ay)^2+(bz-az)^2 - 
[((cx-ax)-(bx-ax))^2+((cy-ay)-(by-ay))^2+((cz-az)-(bz-az))^2]}/2
合并去括号:
|AB|*|AC|*cos(α) =(cx-ax)(bx-ax)+(cy-ay)(by-ay)+(cz-az)(bz-az)
 =(cx-ax,cy-ay,cz-az) * (bx-ax,by-ay,bz-az)
即:
|AB|*|AC|*cos(α) =AC * AB
cos(α) = AC * AB / |AB|*|AC|
向量AB,AC经过标准化后,模长为1,|AB|*|AC| = 1*1 =1,则:
cos(α) = AC*AB/1 = AC*AB;
推导出:
cos(α) =AC*AB;
另一种推导方法:
假设a和b都是二维向量,θ1是a与x轴的夹角,θ2是b与x轴的夹角,向量a与b的夹角θ等于θ1 - θ2.、
a*b = ax*bx + ay*by 
=(|a|*sinθ1)*(|b|*sinθ2) +(|a|*cosθ1)*(|b|*cosθ2)
=|a||b|(sinθ1*sinθ2+cosθ1*cosθ2)
=|a||b|(cos(θ1-θ2))
=|a||b|cosθ
cosθ = a*b/|a||b|
标准化之后的向量a,b的摸|a|、|b|均为1:
cosθ = a*b

注:|a||b|(sinθ1*sinθ2+cosθ1*cosθ2)=|a||b|(cos(θ1-θ2)),这个推导过程参见两角和差公式: