跳到主要内容

01 - 向量(Vector)

向量的定义

数学定义

向量就是一串数字数组,我们通常用列向量的方式来表示它:

a=[1234]a1=ax=1a2=ay=2a3=az=3a4=aw=4\nonumber \mathbf{a} = \begin{bmatrix} 1\\2\\3\\4 \end{bmatrix} \begin{align*} \qquad a_1=a_x=1\\ \qquad a_2=a_y=2\\ \qquad a_3=a_z=3\\ \qquad a_4=a_w=4\\ \end{align*}

几何定义

向量是具有 大小方向 的有向线段。

零向量

对于任何给定的向量维度,都有一个特殊的向量,被称为零向量(Zero Vector):

0=[000]\nonumber \mathbf{0} = \begin{bmatrix} 0\\0\\0 \end{bmatrix}

零向量是特殊的,因为它是唯一的一个大小为零的向量,所有其他向量均具有正大小。此外,零向量也是唯一没有方向的向量。

向量的运算

标量和向量的乘除法

只需用标量乘/除向量的每个分量即可:

k[xyzw]=[kxkykzkw]\nonumber k \begin{bmatrix} x\\y\\z\\w \end{bmatrix} = \begin{bmatrix} kx\\ky\\kz\\kw \end{bmatrix}

如果还理解不了,可以看看几何解释。在几何上,将向量乘/除标量k,具有将长度缩放k|k|倍的效果:

向量的加减法

要使两个向量相加/减,只需分别相加/减他们对应的分量即可:

[x1y1z1w1]±[x2y2z2w2]=[x1±x2y1±y2z1±z2w1±w2]\nonumber \begin{bmatrix} x_1\\y_1\\z_1\\w_1 \end{bmatrix} \pm \begin{bmatrix} x_2\\y_2\\z_2\\w_2 \end{bmatrix} = \begin{bmatrix} x_1\pm x_2\\y_1\pm y_2\\z_1\pm z_2\\w_1\pm w_2 \end{bmatrix}

对于几何解释,这里有三角形法则:

向量的大小

向量的大小是其分量的平方和的平方根,以三维向量为例:

v=vx2+vy2+vz2\nonumber ||\mathbf{v}||=\sqrt{v_x^2+v_y^2+v_z^2}

也被称为向量的 范数(Norm)

对于几何解释,可以用勾股定理来说明(以二维为例,高维度可以推广):

如图,由勾股定理,有:

v2=vx2+vy2\nonumber ||\mathbf{v}||^2=|v_x|^2+|v_y|^2

然后省略右边的绝对值符号,开根号就能得到:

v=vx2+vy2\nonumber ||\mathbf{v}||=\sqrt{v_x^2+v_y^2}

单位向量(Normalized Vector)

有时候,我们只是想用到向量的方向性,而不关注其大小,这时候就能用单位向量(Unit Vector)了。单位向量是大小为1的向量,也被称为标准化向量(Normalized Vector)。

向量标准化的公式如下:

v^=vv\nonumber \mathbf{\hat{v}}=\frac{\mathbf{v}}{||\mathbf{v}||}

需要注意的是,零向量是无法被标准化的。从数学角度,处于零是不对的;在几何角度,标准化零向量会找不到它的方向。

两点间距离公式

两点间距离公式可由向量减法和向量大小推导出来,三维的公式如下:

distance(a,b)=d=(bxax)2+(byay)2+(bzaz)2\nonumber \mathbf{distance(a,b)}=||\mathbf{d}||=\sqrt{(b_x-a_x)^2+(b_y-a_y)^2+(b_z-a_z)^2}

向量点积(Dot Product)

向量点积,也称为内积(Inner Product),在游戏编程中无处不在,其也与矩阵乘法、信号卷积、傅里叶变换等运算有着重要联系。点积的公式如下(以二维为例):

ab=axbx+ayby=abcosθ\nonumber \mathbf{a}·\mathbf{b}=a_xb_x+a_yb_y=\|\mathbf{a}\|\|\mathbf{b}\|\rm{cos}\theta

向量点积是支持交换律,结合律和分配率的。

向量点积主要有以下用途:

求投影

可以求一个向量到另一个向量的投影:

b\mathbf{b}a\mathbf{a}上的投影大小为:

b=b cosθ=aba\nonumber \|b_\|\|=\|\mathbf{b}\|\ \rm{cos}\theta=\frac{\mathbf{a}·\mathbf{b}}{\|\mathbf{a}\|}

然后乘上 a^\mathbf{\hat{a}} 就好了。

判断相对方向

向量点积结果是个标量,其符号具有判断两向量相对方向的功能:

找到两个向量的夹角

由点积公式,可以算出两向量夹角 θ\theta 为:

θ=arccos(abab)=arccos(a^b^)\nonumber \theta =\rm{arccos}\left ( \frac{\mathbf{a}·\mathbf{b}}{\|\mathbf{a}\|\|\mathbf{b}\|} \right ) =\rm{arccos}\left ( \mathbf{\hat{a}}·\mathbf{\hat{b}} \right )

计算向量的大小

向量的大小也能通过点积进行计算:

v=vv\nonumber \|\mathbf{v}\|= \sqrt{\mathbf{v}·\mathbf{v}}

沿某向量进行正交分解

给定以下两个向量:

v,n^\nonumber \mathbf{v} ,\quad \mathbf{\hat{n}}

v\mathbf{v} 分解成与 n^\mathbf{\hat{n}} 垂直和平行的分量。

先求平行的,也就是 v\mathbf{v}n^\mathbf{\hat{n}} 上的投影,已知它的长度为:

v=n^vn^=n^v\nonumber \|\mathbf{v}_\|\|=\frac{\mathbf{\hat{n}}·\mathbf{v}}{\|\mathbf{\hat{n}}\|}=\mathbf{\hat{n}}·\mathbf{v}

然后再乘上n^\mathbf{\hat{n}}即可(因为上边得到的是标量,这里要变成向量):

v=n^(n^v)\nonumber \mathbf{v}_\|=\mathbf{\hat{n}}(\mathbf{\hat{n}}·\mathbf{v})

然后垂直的就简单了:

v=vv\nonumber \mathbf{v_\perp}=\mathbf{v}-\mathbf{v_\|}

向量叉积(Cross Product)

向量叉积只能在三维中引用,其产生三维矢量并且不是可变换的。

叉积的公式如下:

a×b=[x1y1z1]×[x2y2z2]=[y1z2z1y2z1x2x1z2x1y2y1x2]=[0z1y1z10x1y1x10][x2y2z2]\nonumber \mathbf{a\times b}= \begin{bmatrix} x_1\\y_1\\z_1 \end{bmatrix} \times \begin{bmatrix} x_2\\y_2\\z_2 \end{bmatrix} = \begin{bmatrix} y_1z_2-z_1y_2\\z_1x_2-x_1z_2\\x_1y_2-y_1x_2 \end{bmatrix} = \begin{bmatrix} 0 & -z_1 & y_1\\ z_1 & 0 & -x_1\\ -y_1 & x_1 & 0 \end{bmatrix} \begin{bmatrix} x_2\\y_2\\z_2 \end{bmatrix}

叉积的大小公式如下:

a×b=absinθ\nonumber \|\mathbf{a\times b}\|=\mathbf{\|a\|\|b\|}\rm{sin}\theta

可以得出,当两非零向量平行时,他们叉积的结果为零向量;自己和自己叉积的结果也是零向量。

除此之外,叉积的常见性质如下:

向量叉积主要有以下用途:

判断从向量a到b是什么时针方向转动

可以把b\mathbf{b}的尾部放到a\mathbf{a}的头部,然后通过左右手(看坐标系)的大拇指规则来判断:

也能用来判断两向量的左/右侧关系。

判断点在向量组成的图形内外

绕同一个方向判断这个向量与其他所有向量的左右测关系,如果都一致则在内部。

参考资料