zoukankan      html  css  js  c++  java
  • 【几何系列】向量:向量乘法(标量积、向量积)和向量插值

    在本系列上一篇《【几何系列】复数基础与二维空间旋转》讲述了复数和二维旋转之间的联系。

    在本文,向量是线性代数中的基本知识,本文只会侧重它们在计算机图形学和旋转几何学中的要点。

    向量的记号

    向量(vector)常用粗体来表示,与标量相区分(不过我为了方便,仅在此处加粗体)。例如:

    $$mathbf{u}=egin{bmatrix}
    2\
    3
    end{bmatrix}$$

    其中 2 和 3 都称为向量 $mathbf{u}$ 的分量(component)。向量还可以分为列向量行向量,列向量常常是推荐的表示方法。

    向量的图示

    向量作为一种代数元素,在计算机图形学中常用于表示空间中的有向线段和点。

    如下图所示:

    利用向量的表示,有向线段 $u$ 可以通过 $A$ 和 $B$ 两点相减计算得到:

    $$mathbf{u}=egin{bmatrix}
    3\
    4
    end{bmatrix}-egin{bmatrix}
    1\
    1
    end{bmatrix}=egin{bmatrix}
    2\
    3
    end{bmatrix}$$

    可以看到,对于有向线段 $u$ 来说,它的向量表示保存了两条信息方向长度。而对于坐标点 $A$ 和 $B$ 来说,实际上也隐含了两条类似的信息:原点到坐标点方向原点到坐标点距离长度。方向通过向量各分量的比例而确定,而长度则是通过向量大小(magnitude)确定。

    向量大小

    向量大小写作 $left | u ight |$,对分量应用毕达哥拉斯定理(国内称勾股定理)计算得到:

    $$left | u ight |=sqrt{x^2+y^2}$$

    其中 $x$ 和 $y$ 表示 $u$ 的两个分量。

    推广到三维

    前面考虑的是二维平面,如果推广到三维,则可以用向量表示出三维空间的点或有向线段:

    $$u=egin{bmatrix}
    x\ 
    y\ 
    z
    end{bmatrix}$$

    其大小为:

    $$left | u ight |=sqrt{x^2+y^2+z^2}$$

    单位向量

    前面说到,向量包含方向大小的信息。那如果我们只关注方向信息呢?自然会想到把大小固定下来,进而引入了单位向量

    单位向量就是大小为 1 的向量,把普通向量转换为单位向量的过程称为规范化或标准化(normalization)

    向量的规范化很容易,将向量除以它的大小即可。

    $$hat{u}=frac{u}{left | u ight |}$$

    其中 $hat{u}$ 是 $u$ 所对应的单位向量。

    笛卡尔向量

    笛卡尔向量是特殊的单位向量,对应于笛卡尔坐标系中的 x/y/z 轴。即:

    $$i=[1,0,0]^T,j=[0,1,0]^T,k=[0,0,1]^T$$

    向量乘法

    有两种向量乘法的定义,一种是两个向量相乘得到一个标量,称为标量积,又称点乘、点积、数量积;另一种是两个向量相乘得到一个向量,称为向量积,又称叉乘、叉积、矢量积

    标量积

    标量积通过两个向量相乘得到一个标量。标量积的几何定义为:

    $$rcdot s=left | r ight |left | s ight |coseta $$

    简单来说,就是向量 $r$ 对 $s$ 作投影,得到 $rcoseta$,再将投影的大小 $left | r ight |coseta$ 和 $s$ 向量的大小 $left | s ight |$ 相乘(可以交换,不管哪个向量对另一个向量作投影结果都是相同的)。

    标量积的设计是有道理的。

    一方面,标量积在一定程度衡量了两个向量方向的“相似性”。固定大小的两个向量,夹角越小,方向越接近,相似度越高。

    另一方面,标量积既然得到的是一个标量,向量又是标量的一种推广,我们自然希望它和普通标量的乘法统一起来

    与标量不同的是,向量具有方向性。那么在设计标量积的时候,一些显然需要考虑的场景是:

    1. 当两个向量方向一致时,我们希望这个标量积就等于两个向量大小的乘积
    2. 当两个向量方向相反时我们希望这个标量积等于向量方向一致情况的相反数
    3. 当两个向量相互垂直(正交)时,这两个向量其实是线性无关的,我们认为它们俩其实没啥交流语言(或者说相似性为 0),乘积为 0 最好

    利用以上特殊场景,当面对更普遍的情况时,对向量进行正交分解,不难得到 $rcdot s=left | r ight |left | s ight |coseta $ 的定义。

    当然,这只是定义而已,前面这些考虑都只是为了帮助理解这个定义的几何含义。

    标量积还有它的代数定义

    $$rcdot s=r_xs_x+r_ys_y+r_zs_z$$

    即两个向量的各个分量分别相乘,再相加。

    标量积的几何定义和代数定义在笛卡尔坐标系上是等价的。即:从几何定义出发可以推导出代数定义,而从代数定义也可以推导出几何定义。

    这两种定义给了我们两条解决问题的路径,显然,利用数量积作为桥梁,求两个向量的夹角也变得容易起来:

    $$eta =arccos(frac{r_xs_x+r_ys_y+r_zs_z}{left | r ight |left | s ight |})$$

    马里奥赛车里面的标量积应用:

    要获得最大程度的加速效果,开车的方向要与加速板的方向尽可能一致,对加速板方向的投影大小要尽可能大。

    向量积

    向量积通过两个向量相乘得到另一个向量。

    向量积定义为:

    $$left |a  ight | imes left | b ight |=left | t ight |$$

    其中 $t$ 的向量大小为:

    $$left | t ight |=left |a  ight | left | b ight |sin heta$$

    由于向量积得到的一个向量,那么向量就会有方向大小两条信息。

    对于向量 $t$ 的大小,如上图所示,向量积大小等于两个向量张成的平行四边形的面积。该面积衡量了两个向量的差异性(difference)。如果 $a$ 和 $b$ 是垂直(正交)的,两者的差异性最大,在两个向量大小不变的情况此时面积最大($sin heta=1$);如果 $a$ 和 $b$ 是共线的,两者的差异性最小,此时面积等于 0。

    对于向量 $t$ 的方向,考虑的是这样的问题:两个向量虽然张成的面积一样,但是方向却可能不同,只考虑张成的平行四边形面积大小会丢失掉这样的差异。例如笛卡尔向量,如果只考虑面积大小,$i imes j$ 和 $i imes k$ 得到的结果是完全一样的,但是 $j$ 和 $k$ 却是不同的方向。因此为了添加这个方向信息,如下图所示,通常采用右手法则(一种约定,区别于左手法则),规定了向量积 $t$ 的方向,即垂直于 $a$ 和 $b$ 张成的平面。于是 $i imes j$ 和 $i imes k$ 虽然向量大小相同,向量方向却不同。

    向量积不满足交换律,但满足反对称关系

    根据这种关系,可以很容易知道笛卡尔向量的计算规律:

    $$i imes j=k$$

    $$j imes i=-k$$

    $$j imes k=i$$

    $$k imes j=-i$$

    $$k imes i=j$$

    $$i imes k=-j$$

    我们还知道同一向量的向量积为 0(因为夹角 $ heta$ 为 0):

    $$i imes i=0$$

    $$j imes j=0$$

    $$k imes k=0$$

    基于以上关系,我们可以推导出向量积的代数计算公式

    已知两个向量 $a=a_xi+a_yj+a_zk$ 和 $b=b_xi+b_yj+b_zk$,计算:

    egin{align*}
    a imes b &= (a_xi+a_yj+a_zk) imes(b_xi+b_yj+b_zk)\
    &=a_xb_xi imes i + a_yb_yj imes j+a_zb_zk imes k+a_xb_yi imes j+a_xb_zi imes k+a_yb_xj imes i+a_yb_zj imes k+a_zb_xk imes i+a_zb_yk imes j\
    &=0+0+0+a_xb_yk-a_xb_zj-a_yb_xk+a_yb_zi+a_zb_xj-a_zb_yi\
    &=(a_yb_z-a_zb_y)i+(a_zb_x-a_xb_z)j+(a_xb_y-a_yb_x)k\
    &=egin{vmatrix}
    a_y & a_z\
    b_y & b_z
    end{vmatrix}i-egin{vmatrix}
    a_x & a_z\
    b_x & b_z
    end{vmatrix}j+egin{vmatrix}
    a_x & a_y\
    b_x & b_y
    end{vmatrix}k \
    &=egin{vmatrix}
    i & j & k\
    a_x & a_y & a_z\
    b_x & b_y & b_z
    end{vmatrix}
    end{align*}

    最后两步使用了行列式进行整理。最后,我们把向量积的定义和代数计算公式结合起来就是:

    egin{align*}
    mathbf{a} imes mathbf{b} &= left | mathbf{a} ight |left | mathbf{b} ight |sin heta hat{mathbf{t}} \
    &=egin{vmatrix}
    i & j & k\
    a_x & a_y & a_z\
    b_x & b_y & b_z
    end{vmatrix}\
    &=egin{vmatrix}
    a_y & a_z\
    b_y & b_z
    end{vmatrix}i-egin{vmatrix}
    a_x & a_z\
    b_x & b_z
    end{vmatrix}j+egin{vmatrix}
    a_x & a_y\
    b_x & b_y
    end{vmatrix}k
    end{align*}

    $hat{mathbf{t}}$ 表示满足右手定则的单位法向量。

    向量插值

    这里仅讨论两种向量插值技术:线性插值球形插值。线性插值的路径是直线,球形插值的路径是圆形或者曲线

    线性插值

    线性插值非常直观,已知两个向量,给这两个向量各分配一个权重相加,权重和为 1。令插值得到的向量为 $v(t)$,则

    $$v(t)=(1-t)v_1+tv_2=v_1+t(v_2-v_1)$$

    其中 $tin [0,1]$,当 $t=0$ 时,$v(t)=v_1$,当 $t=1$ 时,$v(t)=v_2$。

    根据上式中的第二个等号,可以利用几何的方法推断出插值的路径:

    $(v_2-v_1)$ 就是 $v_1$ 箭头端点指向 $v_2$ 箭头端点的向量,而 $t(v_2-v_1)$ 的箭头端点就在这个向量表示的线段上移动。通过与 $v_1$ 相加后发现,插值出来的 $v(t)$ 的箭头端点也在这条线段上,这就是线性插值的路径

    通过图示我们可以看到,这种线性插值在当两个向量大小相等时,无法保证插值向量的大小不变,在很多应用中我们其实希望这个向量大小是稳定的。比如 $v_1$ 和 $v_2$ 假设表示一条手臂在 $t_1$ 时刻和 $t_2$ 时刻的位置状态的话,我们希望插值得到 $t_1$ 和 $t_2$ 时刻之间的手臂的位置状态,如果用线性插值,我们会发现这个本来长度固定不变的手臂,插值后长度竟然发生变化了。

    这就引入了球形插值

    球形插值

    球形插值的推导过程暂且不表,但是其核心思想是加入了这样的限制条件:两个单位向量插值出来必然也是单位向量,进而保证了我们希望长度稳定的需求

    如果两个向量大小相同,它的插值路径是圆形;如果向量大小不同,则插值路径是曲线。一些例子:

     

    插值公式如下:

    $$v(t)=frac{sin(1-t) heta}{sin heta}v_1+frac{sint heta}{sin heta}v_2$$

    其中,$tin [0,1]$,当 $t=0$ 时,$v(t)=v_1$,当 $t=1$ 时,$v(t)=v_2$。而 $ heta$ 是 $v_1$ 和 $v_2$ 的夹角,可以通过点乘的公式计算余弦

    参考

  • 相关阅读:
    Spring之InstantiationAwareBeanPostProcessor接口介绍
    Spring之BeanPostProcessor(后置处理器)介绍
    JVM中垃圾收集算法总结
    JVM中对象的回收过程
    zookeeper实现动态感知服务器上下线
    Spring事务的传播行为
    java工厂模式
    Spring加载流程源码分析03【refresh】
    Redis客户端操作之Jedis
    微服务设计的四个原则
  • 原文地址:https://www.cnblogs.com/noluye/p/12255135.html
Copyright © 2011-2022 走看看