目录
1. 前言
2. 点乘(dot product)
3. 叉乘(cross product)
3.1 叉乘意义
4. 点到线的距离
5. 点到面的距离
先摘录几个对点乘、叉乘写的比较好的文章:
点乘比较简单,是相应元素的乘积的和:
V1( x1, y1, z1)·V2(x2, y2, z2) = x1*x2 + y1*y2 + z1*z2
注意结果不是一个向量,而是一个标量(Scalar)。点乘有什么用呢,我们有:
A·B = |A||B|Cos(θ)
θ是向量A和向量B间的夹角,这个公式是怎么推导出来的,请参考上面我摘录的文章1,用到了余弦定理推出上述公式。这里|A|我们称为向量A的模(norm)。这样我们就和容易计算两条线的夹角:
Cos(θ) = A·B / (|A|*|B|)
首先我们知道 ,对于向量a和b, a x b的结果,是得到一个既垂直于a又垂直于b的向量,假设记作n.则有下面公式
n = a x b
a x b的长度等于向量a大小和向量b大小和它们之间夹角正弦乘积,即a、b向量构成的平行四边形的面积,即如下:
|axb| = |a||b| sin(θ)
而n的方向,根据使用的是右手坐标系还是左手坐标系而定。以右手坐标系为例: 即伸出右手,四个手指方向从a绕到b, 此时,大姆指方向,就是n的方向。 我们通常叫做右向量。也可以通过如下方法判断:
引用一下维基百科的图来说明问题,有兴趣的兄弟可以照图比划一下。 (注:图中向量是用的a x b来表示)
如果只是为了应用的话,走到这一步就可以停下了。后面的知识,只是为了满足一下好奇心。那我们就来看看,这个结论是怎么来的呢? 我们接着来推导。为了更好地推导,我们需要加入三个轴对齐的单位向量。i,j,k.i,j,k满足以下特点:
i = j x k; j = k x i; k = i x j;
k x j = –i; i x k = –j; j x i = –k;
i x i = j x j = k x k = 0; (0是指0向量)
由此可知,i,j,k是三个相互垂直的向量。它们刚好可以构成一个坐标系。这三个向量的特例就是:
i = (1,0,0)
j = (0,1,0)
k = (0,0,1)
好,那对于处于i,j,k构成的坐标系中的向量u,v我们可以如下表示:
u = Xu*i + Yu*j + Zu*k;
v = Xv*i + Yv*j + Zv*k;
那么:
u x v = (Xu*i + Yu*j + Zu*k) x (Xv*i + Yv*j + Zv*k)
= Xu*Xv*(ixi) + Xu*Yv*(i x j) + Xu*Zv*(i x k) + Yu*Xv*(j x i) + Yu*Yv*(j x j) + Yu*Zv*(j x k) + Zu*Xv*( k x i ) + Zu*Yv(k x j) + Zu*Zv(k x k)
由于上面的i,j,k三个向量的特点,所以,最后的结果可以简化为:
u x v = (Yu*Zv – Zu*Yv)*i + (Zu*Xv – Xu*Zv)j + (Xu*Yv – Yu*Xv)k
于是,在i,j,k构成的坐标系中。集就是上面的结果。当i = (1,0,0) j = (0,1,0) k = (0,0,1)时,我们通常省略i,j,k的写法。最终也就得到了我们的右向量。
叉乘表示垂直于uxv的右向量。可以通过叉乘,修正向量关系,从而构建坐标系。 常见的有 摄相机矩阵和TBN空间转换矩阵的构建。
找出一个点和一条线间的距离是经常遇见的几何问题之一。假设给出三个点,A,B和C,你想找出点C到点A、B定出的直线间距离。第一步是找出A到B的向量AB和A到C的向量AC,现在我们用该两向量的叉积除以|AB|,这就是我们要找的的距离了(下图中的红线)。
d = (AB x AC)/|AB|
(AB X AC)/2是三角形ABC的面积,这个三角形的底是|AB|,高就是C到AB的距离。有时叉积得到的是一个负值,这种情况下距离就是上述结果的绝对值。
当我们要找点到线段的距离时,情况变得稍稍复杂一些。这时线段与点的最短距离可能是点到线段的某一端点,而不是点到直线的垂线。例如上图中点C到线段AB的最短距离应该是线段BC。我们有集中不同的方法来判断这种特殊情况。第一种情况是计算点积AB Bc来判定两线段间夹角。如果点积大于等于零,那么表示AB到BC是在-90到90度间,也就是说C到AB的垂线在AB外,那么AB上到C距离最近的点就是B。同样,如果BAAC大于等于零,那么点A就是距离C最近的点。如果两者均小于零,那么距离最近的点就在线段AB中的某一点。
设某三维平面表达式为:
a*x+b*y+c*z+d = 0
则其法向量即为:
(a,b,c)
任意一点:
p = (x1, y1, z1)
到该平面的距离为:
|a*x1 + b*y1 + c*z1+d| / √(a*a + b*b +c*c)
其中√表示开平方。上述公式怎么算出来的,请参考:解析几何中的4个距离公式:点与点、点到直线、直线间、点到平面