基础几何运算我们这节主要讲解下关于点或者矢量的基础几何运算,这块经常在我们日常应用中出现,因为其内容比较琐碎,所以容易遗忘,在这里我们统一做一些总结。
向量长度计算如前一段所述,向量可以看作是从一点开始到另一点结束的箭头。矢量本身不仅指示点 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建立平行线,形成一个平行四边形,生成平行四边形对角线就是两个向量的和。
基础内容比较繁琐,但是也很重要的,这块内容实际上我们应用过很多次,总是重复去讲述。后面涉及到数学几何学的内容,我都放到这个合集里面更新,下期我们继续!