1. 程式人生 > >向量點積與叉積等幾何的定義及應用研究

向量點積與叉積等幾何的定義及應用研究

要計算兩個向量的點積,需要將兩個向量的對應分量相乘,然後再將乘積相加。下面這段程式碼可以計算出兩個二維向量的點積:

var dotProduct = vectorOne.x * vectorTwo.x +vectorOne.y * vectorTwo.y; 
計算兩個向量之間的點積是很簡單的,不過,這個點積的意義理解起來可就有些不太直觀了。首先請注意,與兩個向量的加減法運算結果不同,點積不是向量。專業人員把這種值叫做“標量”(scalar,也叫“純量”),就是說,它僅僅是個數字而已。

一,向量點積與叉積的定義

向量的點積:
假設向量u(uxu

y)和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α 
===>
   -2u
xvx - 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 + u

yvy = 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)