我们这节主要讲解下关于点或者矢量的基础几何运算,这块经常在我们日常应用中出现,因为其内容比较琐碎,所以容易遗忘,在这里我们统一做一些总结。
如前一段所述,向量可以看作是从一点开始到另一点结束的箭头。矢量本身不仅指示点 B 从 A 的方向,还可以用来计算 A 和 B 之间的距离。这是由矢量的长度给出的,可以使用以下公式轻松计算:
$$ ||N|| = \sqrt{N.x * N.x + N.y * N.y + N.z * N.z} $$
双杠 (||V||) 符号表示向量的长度。矢量的长度有时也称为范数或大小。
向量归一化指的是将一个向量除以它的长度,使其方向保持不变但长度变为1的过程。归一化后的向量也被称为单位向量,它在空间中仅仅表示方向,而不包括长度或大小信息。其数学表示方法如下所示:
$$ \hat{N} = {N \over { || N || }} $$
点积或标量积需要两个向量 A 和 B,可以看作是一个向量到另一个向量的投影。点积的结果是一个实数(编程中的浮点数或双精度数)。
求二者的点积,我们一般有以下三种方式:
(1)根据几何关系,A向量的长度乘上A向量与B向量角度的cos值,就是A向量在B向量上的投影。
(2)两个向量之间的点积用点符号“. ”,一般我们用函数dot(当然不同API也提供了不同的解决方式)
(3)两个向量之间的点积用点符号“. ”表示。点积在数理上的运算可以表示为将 A 向量的每个元素与向量 B 中的对应元素相乘,然后取每个乘积的和。我们以三维向量为例子:
$$ N \cdot M = N.x * M.x + N.y * M.y + N.z * M.z $$
叉积也是对两个向量的运算,但是和点积有差异,叉积返回一个向量。此操作的特殊性在于叉积产生的向量与其他两个向量垂直。使用以下语法编写叉积运算:
$$ NM = N \times M $$
上述式子用理数计算方式:
$$ \begin{array}{l} NM_X = N_Y * M_Z - N_Z * M_Y\\ NM_Y = N_Z * M_X - N_X * M_Z\\ NM_Z = N_X * M_Y - N_Y * M_X \end{array} $$
转换成矩阵形式如下所示:
$$ \begin{pmatrix} a_x\\a_y\\a_z \end{pmatrix} \times \begin{pmatrix} b_x\\b_y\\b_z \end{pmatrix} = \begin{pmatrix} a_yb_z - a_zb_y\\ a_zb_x - a_xb_z\\ a_xb_y - a_yb_x \end{pmatrix} $$
积的结果是另一个与其他两个向量正交的向量。两个向量之间的叉积用叉号表示:NxM. 两个向量 A 和 B 定义一个平面,生成的向量 C 垂直于该平面。向量 A 和 B 不必相互垂直,但当它们相互垂直时,生成的 A、B 和 C 向量将形成笛卡尔坐标系(假设向量具有单位长度)。如上图所示。
冰哥说:叉积中涉及的向量的顺序会影响结果向量 。如果我们采用前面的示例(取笛卡尔坐标系的 x 轴和 y 轴之间的叉积),您可以看到 Nx M不会给您与 M x N
相同的结果:
$$ N \times M = (1,0,0) \times (0,1,0) = (0,0,1), $$
$$ M \times N=(0,1,0) \times (1,0,0)=(0,0,-1). $$
至于原因其实和我们上节提到左右手坐标系有关系。
我们说叉积是不满足乘法交换率(交换任意两个参数的位置会使结果取反):如果NxM=C
,则 MxN=-C
。记得在上一章中,当两个向量用于定义坐标系的前两个基时,第三个向量可以指向平面的任意一侧时。可以使用双手来区分这两个系统。计算向量叉乘也是类似的。
在数学中,叉积的结果称为伪向量。当根据计算法线的点的切线和副切线计算表面法线时,叉积运算中的矢量顺序很重要。根据此顺序,生成的法线可以指向表面内部(向内法线)或远离它(向外法线)。
矢量加减法一般我们采用两种方式求解,一种是三角形法则,一种是平行四边形法则。
如下图所示,比如向量a和向量b相加,生成向量c,我们可以采用三角形法则,将向量a与向量b收尾相连。新生成的向量和是两个向量收尾向量,如黄色的向量所示。
此外,我们也可以采用平行四边形法则,如下图所示,我们将向量a和向量b建立平行线,形成一个平行四边形,生成平行四边形对角线就是两个向量的和。
基础内容比较繁琐,但是也很重要的,这块内容实际上我们应用过很多次,总是重复去讲述。后面涉及到数学几何学的内容,我都放到这个合集里面更新,下期我们继续!