最爱午后红茶

Vectors

日期图标
2023-03-15

Vectors

向量(Vectors)
图一:向量
  • Usually written as a\overrightarrow{\text{a}} or in bold a
  • Or using start and end points AB\overrightarrow{\text{AB}} = B - A
  • Direction and length
  • No absolute starting position

Vector Normalization

  • Magnitude (length) of a vector written as a\lVert{\overrightarrow{\text{a}}}\rVert
  • Unit vector
    • A vector with magnitude of 1
    • Finding the unit vector of a vector (normalization): a^\hat{a} = aa\frac{\overrightarrow{\text{a}}}{\lVert{\overrightarrow{\text{a}}}\rVert}
  • Used to represent directions

Vector Addition

向量加法(Vector addition)
图二:向量加法
  • Geometrically: Parallelogram law & Triangle law
  • Algebraically: Simply add coordinates

Cartesian Coordinates

向量在笛卡尔坐标系的表示(Cartesian coordinates)
图三:Cartesian Coordinates
  • X and Y can be any (usually orthogonal unit) vectors

在图形学,给定一个向量,一般默认是列向量,比如 A = (xy)\left(\begin{matrix}x\\y\end{matrix}\right),可以通过互换转化为行向量 ATA^T = (xy)\left(\begin{matrix}x & y\end{matrix}\right)。把向量表示成直角坐标系的代数形式,一个好处是很容易计算它的长度。向量的长度 A\lVert{A}\rVert = x2+y2\sqrt{x^2 + y^2}

Vector Multiplication

Dot (scalar) Product

向量点乘(Vector dot product)
图四:向量点乘

向量点乘的定义为:ab{\overrightarrow{\text{a}}}{\cdot}{\overrightarrow{\text{b}}} = abcosθ{\lVert{\overrightarrow{\text{a}}}\rVert}{\lVert{\overrightarrow{\text{b}}}\rVert}{\cos{\theta}},由此可看出,两个向量点乘的结果是一个。而向量点乘的一个运用是快速计算两个向量之间的夹角cosθ=abab\cos{\theta} = \frac{{\overrightarrow{\text{a}}}{\cdot}{\overrightarrow{\text{b}}}}{{\lVert{\overrightarrow{\text{a}}}\rVert}{\lVert{\overrightarrow{\text{b}}}\rVert}}。特别的,如果两个向量都是单位向量,则它们的点乘结果就是它们之间夹角的余弦:cosθ=a^b^\cos{\theta} = \hat{a}\cdot\hat{b}

点乘的性质

  • 交换律:ab=ba{\overrightarrow{\text{a}}}{\cdot}{\overrightarrow{\text{b}}} = {\overrightarrow{\text{b}}}{\cdot}{\overrightarrow{\text{a}}}
  • 结合律:a(b+c)=ab+ac{\overrightarrow{\text{a}}}{\cdot}(\overrightarrow{\text{b}} + \overrightarrow{\text{c}}) = {\overrightarrow{\text{a}}}{\cdot}{\overrightarrow{\text{b}}} + {\overrightarrow{\text{a}}}{\cdot}{\overrightarrow{\text{c}}}
  • 分配律:(ka)b=a(kb)=k(ab)(k\overrightarrow{\text{a}})\cdot\overrightarrow{\text{b}} = \overrightarrow{\text{a}}\cdot(k\overrightarrow{\text{b}}) = k(\overrightarrow{\text{a}}\cdot\overrightarrow{\text{b}})

二维坐标系中的点乘:

  • ab=(xaya)(xbyb)=xaxb+yayb\overrightarrow{\text{a}}\cdot\overrightarrow{\text{b}} = \left(\begin{matrix}x_a\\y_a\end{matrix}\right)\cdot\left(\begin{matrix}x_b\\y_b\end{matrix}\right) = x_{a}x_{b} + y_{a}y_{b}

三维坐标系中的点乘:

  • ab=(xayaza)(xbybzb)=xaxb+yayb+zazb\overrightarrow{\text{a}}\cdot\overrightarrow{\text{b}} = \left(\begin{matrix}x_a\\y_a\\z_a\end{matrix}\right)\cdot\left(\begin{matrix}x_b\\y_b\\z_b\end{matrix}\right) = x_{a}x_{b} + y_{a}y_{b} + z_{a}z_{b}

点乘在图形学中可用于计算一个向量相对于另一个向量的投影(projection)

向量投影(Vector projection)
图五:向量投影

我们定义 b\overrightarrow{\text{b}}_{\bot}b\overrightarrow{\text{b}}a\overrightarrow{\text{a}} 上的投影,其中:

  • b\overrightarrow{\text{b}}_{\bot}a\overrightarrow{\text{a}} 同方向,即 b\overrightarrow{\text{b}}_{\bot} = ka^\hat{a}
  • k=b=bcosθk = \lVert{\overrightarrow{\text{b}}_{\bot}}\rVert = \lVert{\overrightarrow{\text{b}}}\rVert\cos{\theta}

向量的投影可以分解一个向量,比如 b\overrightarrow{\text{b}} 可以分解为相互垂直b\overrightarrow{\text{b}}_{\bot}bb\overrightarrow{\text{b}} - \overrightarrow{\text{b}}_{\bot}

向量分解(Vector decomposition)
图六:向量分解

点乘还可以用来判断前后的方向关系:如图七,假如以与 a\overrightarrow{\text{a}} 垂直的平面为界限,平面往上表示前面 (forward),向下表示后面 (backward)。则当某向量与 a\overrightarrow{\text{a}} 做点乘如果大于 0,则表示在前面,如 b\overrightarrow{\text{b}};如果小于 0,则表示在后面,如 c\overrightarrow{\text{c}};如果等于 0,则刚好在平面上。

向量点乘判断接近与方向(Vector approach)
图七:向量点乘判断前后

同样的道理,点乘还可以判断两个向量在方向上有多接近。比如图七,b\overrightarrow{\text{b}}a\overrightarrow{\text{a}} 比较接近,点乘的结果会接近 1;如果方向远离 a\overrightarrow{\text{a}},则跟 a\overrightarrow{\text{a}} 点乘的结果会变小,当方向完全跟 a\overrightarrow{\text{a}} 相反时,点乘的结果为 -1。

Cross product

  • Cross product is orthogonal to two initial vectors
  • Direction determined by right-hand rule
  • Useful in constructing coordinate systems (later)
向量叉乘(Vector cross product)
图八:向量叉积

两个向量 a\overrightarrow{a}b\overrightarrow{b} 的叉积 a×b\overrightarrow{a} \times \overrightarrow{b} 的结果是一个新的向量,该向量垂直于 a\overrightarrow{a}b\overrightarrow{b} 所在的平面,其方向由右手定则确定。如图九,a×b\overrightarrow{a} \times \overrightarrow{b} 产生的新向量的方向的确认方法为:伸出右手,食指指向 a\overrightarrow{a},中指指向 b\overrightarrow{b},大拇指与食指和中指所在平面垂直,则大拇指方向为 a×b\overrightarrow{a} \times \overrightarrow{b} 的方向。同样的,也有相对应的左手定则;不过为了方便,该课程讨论的坐标系均以右手定则为基准,即在三维坐标系中,如果 a\overrightarrow{a}b\overrightarrow{b} 所在平面为 xy 平面,则 a×b\overrightarrow{a} \times \overrightarrow{b} 指向 z 轴方向。

右手定则与向量叉乘方向(Right hand role)

图九:右手定则 (https://en.wikipedia.org/wiki/Right-hand_rule)

根据右手定则,a×bb×a\overrightarrow{a} \times \overrightarrow{b} \neq \overrightarrow{b} \times \overrightarrow{a},因为两者方向正好相反,因此叉积不满足交换律,但是有这样的运算关系:a×b=b×a\overrightarrow{a} \times \overrightarrow{b} = -\overrightarrow{b} \times \overrightarrow{a}

叉积的性质

  • a×b=b×a\overrightarrow{a} \times \overrightarrow{b} = -\overrightarrow{b} \times \overrightarrow{a}
  • a×a=0\overrightarrow{a} \times \overrightarrow{a} = \overrightarrow{0}
  • a×(b+c)=a×b+a×c\overrightarrow{a} \times (\overrightarrow{b} + \overrightarrow{c}) = \overrightarrow{a} \times \overrightarrow{b} + \overrightarrow{a} \times \overrightarrow{c}
  • a×(kb)=k(a×b)\overrightarrow{a} \times (k\overrightarrow{b}) = k(\overrightarrow{a} \times \overrightarrow{b})

叉积用代数来表示:

  • a=(xa,ya,za)\overrightarrow{a} = (x_a, y_a, z_a)
  • b=(xb,yb,zb)\overrightarrow{b} = (x_b, y_b, z_b)
  • a×b=(yazbybzazaxbxazbxaybyaxb)\overrightarrow{a} \times \overrightarrow{b} = \left(\begin{matrix}y_{a}z_{b}-y_{b}z_{a}\\z_{a}x_{b}-x_{a}z_{b}\\x_{a}y_{b}-y_{a}x_{b}\end{matrix}\right)

叉积可以用来判断两个向量的左右关系。如图十,假设 a\overrightarrow{a}b\overrightarrow{b} 所在平面为 xy 平面,我们可以看到 b\overrightarrow{b}a\overrightarrow{a} 的左边,这个在数字上应该怎么表示呢?我们只需要看 a×b\overrightarrow{a} \times \overrightarrow{b} 的结果即可。在这个例子里,结果是正的(a×b\overrightarrow{a} \times \overrightarrow{b} 跟 z 轴正方向一致),因此 b\overrightarrow{b}a\overrightarrow{a} 的左边。如果反过来看,a\overrightarrow{a} 是不是在 b\overrightarrow{b} 的右边呢?计算 b×a\overrightarrow{b} \times \overrightarrow{a} 可知结果是负的(b×a\overrightarrow{b} \times \overrightarrow{a} 跟 z 轴负/反方向一致),因此 a\overrightarrow{a}b\overrightarrow{b} 的右边。

向量叉积判断左右(Vector left right)
图十:叉积判断左右

叉积还可以用来判断内外的关系。这一点在图形学里有相当广泛的应用,比如说:给定一个三角形 ABC 和一点 P,判断 P 是否在三角形内部

以图十一举例,我们假设三角形 ABC 由三个向量 AB\overrightarrow{AB}BC\overrightarrow{BC}CA\overrightarrow{CA} 构成。由 AB×AP\overrightarrow{AB} \times \overrightarrow{AP} 的结果可知,AP\overrightarrow{AP}AB\overrightarrow{AB} 的左侧,即 P 在 AB\overrightarrow{AB} 的左侧;同理得知 P 也在 BC\overrightarrow{BC}CA\overrightarrow{CA} 的左侧;因此 P 在三角形 ABC 内。即 P 要在三角形内的话,则 P 需要在三角形每条首尾相连组成的向量(逆时针或顺时针)的同一侧,否则 P 在三角形外。

向量叉积判断三角形内外(vector in out)
图十一:叉积判断内外

用向量的叉乘可以定义一些互相垂直的轴,这些轴可以形成一个坐标系。比如定义 u\overrightarrow{u}v\overrightarrow{v}w\overrightarrow{w} 三个单位向量,且这三个单位向量两两之间相互垂直。则它们有这些关系:

  • u=v=w=1\lVert{\overrightarrow{u}}\rVert = \lVert{\overrightarrow{v}}\rVert = \lVert{\overrightarrow{w}}\rVert = 1
  • uv=vw=uw=0\overrightarrow{u}\cdot\overrightarrow{v} = \overrightarrow{v}\cdot\overrightarrow{w} = \overrightarrow{u}\cdot\overrightarrow{w} = 0
  • w=u×v\overrightarrow{w} = \overrightarrow{u}\times\overrightarrow{v} (right-handed)

这样就可以把三维坐标系上的任意向量 p\overrightarrow{p} 分解到这 3 个轴上。

p\overrightarrow{p} 在 u 轴上的投影 p(u)=p(u)u=pcosθu\overrightarrow{p}_{\bot(u)} = \lVert{\overrightarrow{p}_{\bot(u)}}\rVert\overrightarrow{u} = \lVert{\overrightarrow{p}}\rVert\cos{\theta}\overrightarrow{u}。根据点乘的定义 pu=pucosθ\overrightarrow{p}\cdot\overrightarrow{u} = \lVert{\overrightarrow{p}}\rVert\lVert{\overrightarrow{u}}\rVert\cos{\theta},因为 u\overrightarrow{u} 是单位向量,所以 u=1\lVert{\overrightarrow{u}}\rVert = 1,所以 pu=pcosθ\overrightarrow{p}\cdot\overrightarrow{u} = \lVert{\overrightarrow{p}}\rVert\cos{\theta},所以 p(u)=(pu)u\overrightarrow{p}_{\bot(u)} = (\overrightarrow{p}\cdot\overrightarrow{u})\overrightarrow{u}

类似地,p\overrightarrow{p} 在 v 轴上的投影 p(v)=(pv)v\overrightarrow{p}_{\bot(v)} = (\overrightarrow{p}\cdot\overrightarrow{v})\overrightarrow{v}p\overrightarrow{p} 在 w 轴上的投影 p(w)=(pw)w\overrightarrow{p}_{\bot(w)} = (\overrightarrow{p}\cdot\overrightarrow{w})\overrightarrow{w}

则根据向量加法得 p=(pu)u+(pv)v+(pw)w\overrightarrow{p} = (\overrightarrow{p}\cdot\overrightarrow{u})\overrightarrow{u} + (\overrightarrow{p}\cdot\overrightarrow{v})\overrightarrow{v} + (\overrightarrow{p}\cdot\overrightarrow{w})\overrightarrow{w}

* 未经同意不得转载。