点积与向量积(点乘与叉乘)

参考:《计算机图形学》
参考: 百度百科
参考: http://zuoye.baidu.com/question/f78a7e9b076367b03f1df832a8c131b3.html
参考: https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%BC%A6%E5%AE%9A%E7%90%86
参考:https://zh.wikipedia.org/wiki/%E7%82%B9%E7%A7%AF
参考:https://zh.wikipedia.org/wiki/%E5%8F%89%E7%A7%AF

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

点积/点乘应用:
物理学中力学的力做功的问题,经常用到点积计算。
计算机图形学常用来进行方向性判断,如两向量点积大于0,则它们的方向朝向相近;如果小于0,则方向相反。

叉积/叉乘应用:
在物理学力学、电磁学、光学和计算机图形学等理工学科中,叉积应用十分广泛。例如力矩、角动量、洛伦兹力等矢量都可以由向量的叉积求解。在进行这些物理量的计算时,往往可以借助右手定则辅助判断方向。

 

0. 背景公式

圆周角定理:
同一条弧所对圆周角等于它所对圆心角的一半

余弦定理:(反映边和对角余弦的关系,三条边可以确定角度,二条边加夹角可以确定另一边长度)
设边为ABC,边对角为abc,则: 
A^2 = B^2 + C^2 - 2BCcosa
B^2 = A^2 + C^2 - 2ACcosb
C^2 = A^2 + B^2 - 2ABcosc

正弦定理:(反映 边/对角正弦比值 为外接矩形的直径长度)
设边为ABC,边对角为abc,则: 
A/sina = B/sinb = C/sinc = 2R (R为三角形对应的外切圆,使用圆周角定理很容易证明该定理)

1. 二维向量

设向量:
V1(X, Y, Z)    
极坐标系下表示向量为:
V1(R, cosx, siny) 
注:(R-向量长度,cosx-向量与X正轴夹角cos值,sinx-向量与X正轴夹角的sin值)

则向量的长度计算:
R = 根号(X^2 + Y^2)
借用极坐标方式反推计算为:cos角度非0时支持
R = |X / cosx|
R = |Y / sinx|

从而两个向量长度相乘时:
R1 * R2 = 根号[(X1^2+Y1^2) * (X2^2+Y2^2)]
借用极坐标方式:cos角度非0时支持
R1 * R2 = |X1/cosx1| * |X2/cosx2| = |X1 * X2 / cosx1 / cosx2|
R1 * R2 = |Y1/sinx1| * |Y2/sinx2| = |Y1 * Y2 / sinx1 / sinx2|

点积/点乘DotProduct:
V1.V2 = x1*x2 + y1*y2

矩阵表示为
(x1, y1) * (x2   = x1 * x2 + y1 * y2
                 y2)

证明过程:
V1.V2 =|V1||V2|cos = R1R2cos
V3=R2-R2,围成三角形,根据余弦定理cos = (R1^2 + R2^2 - R3^2) / 2R1R2
所以V1.V2 = (R1^2+R2^2-R3^2)/2 = (x1^2+y1^2+x2^2+y2^2 - (x2-x1)^2 - (y2-y1)^2 ) / 2
                  = (2x1x2 + 2y1y2) / 2
                  = x1x2 + y1y2
 

叉积/叉乘crossProduct:
cross(V1, V2) = |V1| |V2| sin * n (n指右手定则确定出的单位向量)
                        = (x1y2 - y1x2) * k (k为z轴单位向量(0,0,1))
                        = (0, 0, x1y2-y1x2)

矩阵表示为:i-X轴单位向量 j-Y轴单位向量 k-Z轴单位向量   i * j = k   j * i = -K
(i,       j,     k)     =  (y1*0-0*y2,  0*x2-x1*0, x1y2-y1x2) = (0, 0, x1y2-y1x2)
(x1    y1    0)
(x2    y2    0)

证明过程:
右手坐标系中,基向量i,j,k 满足以下等式:
i * j = k     j * k = i    k * i = j    j * i = -k    k * j = -i    i * k = -j 
另外参考定义中乘的sin角度,则 0 = i * i = j * j = k * k
另外叉乘满足乘法结合率,使用i j k变化V=x * i + y * j
cross(V1, V2) = (x1, y1) (x2, y2)
                       = (x1* i + y1* j) * (x2 * i + y2 * j) 
                       = (x1x2ii + x1y2ij + y1x2ji +  y1y2jj) = x1y2k - y1x2k
                       = (x1y2 - y1x2) k
 


2. 三维向量

设向量:
V(X, Y, Z)
极坐标系下表示向量为:
V(R, cosx, cosy, cosz)
(cosx-向量与X正轴夹角cos值,cosy-向量与Y正轴夹角的cos值, cosz-向量与Z正轴夹角的cos值)

向量长度:(标量)
R = 根号(X*X + Y*Y + Z*Z)
借用极坐标方式反推计算为:cos角度非0时支持
R = |X / cosx|
R = |Y / cosy|
R = |Z / cosZ|  

从而两个向量长度相乘时:
R1 * R2 = 根号[(X1^2+Y1^2 + Z1^2) * (X2^2+Y2^2+Z2^2)]
借用极坐标方式:cos角度非0时支持
R1 * R2 = |X1/cosx1| * |X2/cosx2| * |X3/cosx3| = |X1 * X2 *X3 / cosx1 / cosx2 / cosx3|

点积/点乘DotProduct:
V1.V2 = x1*x2 + y1*y2 + z1*z2

矩阵表示为
(x1, y1, z1) * (x2   = x1*x2 + y1*y2 + z1*z2
                      y2
                      z2)

证明过程:
V1.V2 =|V1||V2|cos = R1R2cos
V3=R2-R2,围成三角形,根据余弦定理cos = (R1^2 + R2^2 - R3^2) / 2R1R2
所以V1.V2 = (R1^2+R2^2-R3^2)/2 = (x1^2+y1^2+z1^2+x2^2+y2^2+z2^2 - (x2-x1)^2 - (y2-y1)^2 - (z2-z1)^2) / 2
                  = (2x1x2 + 2y1y2 + 2z1z2) / 2
                  = x1x2 + y1y2 + z1z2

 

叉积/叉乘crossProduct:
cross(V1, V2) = |V1| |V2| sin * n (n指右手定则确定出的单位向量

                        = (y1z2-z1y2)i + (z1x2-x1z2)j + (x1y2-y1x2)k (i,j,k分别为xyz轴单位向量)
                        = (y1z2-z1y2, z1x2-x1z2, x1y2-y1x2)

矩阵表示为:i-X轴单位向量 j-Y轴单位向量 k-Z轴单位向量   i * j = k   j * i = -K
(i,       j,     k)     =  (y1z2-z1y2)i + (z1x2-x1z2)j + (x1y2-y1x2)k  = (y1*z2-z1*y2,  z1*x2-x1*z2, x1y2-y1x2)
(x1    y1    z1)
(x2    y2    z2)

:n方向为V1到V2右手定律指向方向,为垂直于V1,V2平面的轴

证明过程:
右手坐标系中,基向量i,j,k 满足以下等式:
i * j = k     j * k = i    k * i = j    j * i = -k    k * j = -i    i * k = -j 
另外参考定义中乘的sin角度,则 0 = i * i = j * j = k * k
另外叉乘满足乘法结合率,使用i j k变化V=x * i + y * j
cross(V1, V2) = (x1, y1, z1) (x2, y2, z2)
                       = (x1*i + y1*j + z1*k) * (x2*i + y2*j + z2*k) 
                       = x1x2ii + x1y2ij + x1z2ik + y1x2ji + y1y2jj + y1z2jk + z1x2ki + z1y2kj + z1z2kk
                       = x1y2k - x1z2j - y1x2k + y1z2i + z1x2j - z1y2i
                       = (y1z2-z1y2)i + (z1x2-x1z2)j + (x1y2-y1x2)k 
                       = (y1z2-z1y2, z1x2-x1z2, x1y2-y1x2)

 

3. 应用介绍

点乘dotProduct与crossProduct两个之间的差别是比较大的。

dotProduct计算出的一个数值结果,类似于功 = F * S,我们知道同样的力量,我们可以用于拔河把对方拔过来,也可能被拔过去,效果是完全不一样的,这就是力的方向和移动方向投影一致与不一致的区别,导致做正功与做负功的区别。
F, S方向<90度,做正功
F,S垂直,未做功
F,S方向>90度,做负功

公式:
dotProduct<向量A, 向量B> = |A| |B| cos
// 把力拆成三个方向,分别是x/y/z三个方向,拆成三个方向后,因为互相垂直,不同方向的cos为0,所以只有同方向的才需要计算
=|Ax| |Bx| + |Ay| |By| + |Ax| |Cz|
= Xa*Xb + Ya*Yb + Za*Zb

说明:
|A| A的长度 |B|B的长度
向量A(Xa, Ya, Za)
向量B(Xb, Yb, Zb)

两个向量的夹角<90度时,两个相量结果为正值;
夹角=90度时,结果为0
夹角>90度时,结果为负值

 

crossProduct计算出的一个新向量,新向量垂直于这两个计算向量,符合右手法则。类似于力距的计算。

力距: 在物理学里,力矩是一个向量,可以被想象为一个旋转力或角力,导致出旋转运动的改变。像拧螺丝,使螺丝拧紧或拧开。力矩的单位是N●m或kN●m,物理学上指使物体转动的力乘以到转轴的距离

 

两个向量叉乘:
|crossProduct(A, B)| = |A| |B| sin
crossProduct(A, B) = u |A| |B| sin   // u: 单位向量,使用右手法则可以计算得出

// 把A, B按x/y/z三个方向拆分,拆分成三个方向后,因为互相垂直,同方向sin(0度)=0,不同方向sin(90度)=1或sin(-90度)=-1,所以只有不同方向的值才会保留
// 根据获取结果对应的正负轴的不同,得出
// AxBy(正z轴)  – AxBz(负y轴) 
// -AyBx(负z轴)  AyBz(正x轴) 
// AzBx(正y轴)   AzBy(负x轴) 把这些结果整合就可以得到

crossProduct(A, B) = (AyBz – AzBy,    AzBx - AxBz,    AxBy - AyBx)

行列式表达 i,j,k表达单位x轴,y轴,z轴向量
i        j       k
Ax  Ay   Az
Bx  By   Bz
crossProduct(A, B) = (AyBz – AzBy)i + (AzBx – AxBz)j + (AxBy – AyBx)k

 

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

 

你可能感兴趣的:(算法,数学)