向量点积与叉积等几何的定义及应用研究

要计算两个向量的点积,需要将两个向量的对应分量相乘,然后再将乘积相加。下面这段代码可以计算出两个二维向量的点积:

var dotProduct = vectorOne.x * vectorTwo.x +vectorOne.y * vectorTwo.y; 
计算两个向量之间的点积是很简单的,不过,这个点积的意义理解起来可就有些不太直观了。首先请注意,与两个向量的加减法运算结果不同,点积不是向量。专业人员把这种值叫做“标量”(scalar,也叫“纯量”),就是说,它仅仅是个数字而已。

一,向量点积与叉积的定义

向量的点积:
假设向量u(uxuy)和v(vxvy),uv之间的夹角为α,从三角形的边角关系等式出发,可作出如下简单推导:
  |u - v||u - v| = |u||u| + |v||v| - 2|u||v|cosα   
===>
  (ux - vx2 + (uy - vy)2  uxuy2 +vx2+vy2- 2|u||v|cosα 
===>
   -2uxvx - 2uyvy = -2|u||v|cosα
===>
   cosα = (uxvx + uyvy) / (|u||v|)
这样,就可以根据向量uv的坐标值计算出它们之间的夹角。
定义uv的点积运算: u . v = (uxvx + uyvy),

上面的cosα可简写成: cosα = u . v / (|u||v|)
u . v = 0时(即uxvx + uyvy = 0),向量uv垂直;当u . v > 0时,uv之间的夹角为锐角;当u . v < 0时,uv之间的夹角为钝角。
可以将运算从2维推广到3维。


两个单位向量的点积得到两个向量夹角的cos值,通过它可以知道两个向量的相似性,利用点积可判断一个多边形是否面向摄像机还是背向摄像机。


向量的叉积:
假设存在向量u(uxuyuz), v(vxvyvz), 求同时垂直于向量uv的向量w(wxwywz).
因为wu垂直,同时wv垂直,所以w . u = 0, w . v = 0; 即
uxwx + uywy + uzwz = 0;
vxwx + vywy + vzwz = 0;
分别削去方程组的wywx变量的系数,得到如下两个等价方程式:


(uxvy - uyvx)wx = (uyvz - uzvy)wz
(uxvy - uyvx)wy = (uzvx - uxvz)wz
于是向量w的一般解形式为:


w = (wxwywz) = ((uyvz - uzvy)wz / (uxvy - uyvx), (uzvx - uxvz)wz / (uxvy - uyvx), wz)
  = (wz / (uxvy - uyvx) * (uyvz - uzvyuzvx - uxvzuxvy - uyvx))
因为:


   ux(uyvz - uzvy) + uy(uzvx - uxvz) + uz(uxvy - uyvx)
 = uxuyvz - uxuzvy + uyuzvx - uyuxvz + uzuxvy - uzuyvx
 = (uxuyvz - uyuxvz) + (uyuzvx - uzuyvx) + (uzuxvy - uxuzvy)   
 = 0 + 0 + 0 = 0
   vx(uyvz - uzvy) + vy(uzvx - uxvz) + vz(uxvy - uyvx)   
 = vxuyvz - vxuzvy + vyuzvx - vyuxvz + vzuxvy - vzuyvx
 = (vxuyvz - vzuyvx) + (vyuzvx - vxuzvy) + (vzuxvy - vyuxvz)
 = 0 + 0 + 0 = 0
由此可知,向量(uyvz - uzvyuzvx - uxvzuxvy - uyvx)是同时垂直于向量uv的。
为此,定义向量u = (uxuyuz)和向量 v = (vxvyvz)的叉积运算为:u x v = (uyvz - uzvyuzvx - uxvzuxvy - uyvx)
上面计算的结果可简单概括为:向量x v垂直于向量uv

根据叉积的定义,沿x坐标轴的向量i = (1, 0, 0)和沿y坐标轴的向量j = (0, 1, 0)的叉积为:
 i x j = (1, 0, 0) x (0, 1, 0) = (0 * 0 - 0 * 1, 0 * 0 - 1 * 0, 1 * 1 - 0 * 0) = (0, 0, 1) = k
同理可计算j x k:
 j x k = (0, 1, 0) x (0, 0, 1) = (1 * 1 - 0 * 0, 0 * 0 - 0 * 1, 0 * 0 - 0 * 0) = (1, 0, 0) = i
以及k x i:
 k x i = (0, 0, 1) x (1, 0, 0) = (0 * 0 - 1 * 0, 1 * 1 - 0 * 0, 0 * 0 - 0 * 0) = (0, 1, 0) = j
由叉积的定义,可知:
 v x u = (vyuz - vzuyvzux - vxuzvxuy - vyux) = - (u x v)


猜你喜欢

转载自blog.csdn.net/yeluo_vinager/article/details/53261650