【数学】向量

本文最后更新于 2025年6月9日 晚上

【数学】向量

运算法则

点乘

输入两个向量,输出一个标量。又称作标量积,内积。

点乘很类似与标量的乘法,且满足对应的运算法则,包括因式分解之类的公式都可以套用,甚至可以考虑省略点乘的符号,就像乘法那样(不过这不是标准做法)。

定义

  • 几何定义:ab=abcos(θ)\vec{a} \cdot{} \vec{b} = |\vec{a}| |\vec{b}| \cos(\theta)
  • 代数定义:ab=i=1naibi=a1b1+a2b2++anbn\vec{a} \cdot{} \vec{b} = \sum_{i=1}^{n} a_i b_i = a_1 b_1 + a_2 b_2 + \dots + a_n b_n

意义

  • dot(a,b) > 0 :a 和 b 同向,即夹角为 0-90。
  • dot(a,b) = 0 :a 和 b 相互垂直。
  • dot(a,b) < 0 :a 和 b 反向,即夹角为 90-180。

性质

  • 满足交换律:ab=ba\vec{a} \cdot \vec{b} = \vec{b} \cdot \vec{a}
  • 满足加法分配律:a(b+c)=ab+ac\vec{a} \cdot (\vec{b} + \vec{c}) = \vec{a} \cdot \vec{b} + \vec{a} \cdot \vec{c}
  • 乘以标量时满足:(c1a)(c2b)=(c1c2)(ab)( c_1 \vec{a} ) \cdot ( c_2 \vec{b} ) = ( c_1 c_2 ) ( \vec{a} \cdot \vec{b} )

变形

  • vv=v2\vec{v} \cdot \vec{v}= |\vec{v}|^2

    vv=vx2+vy2+vz2=vx2+vy2+vz22=v2 \begin{aligned} \vec{v} \cdot \vec{v} &= v_x^2+v_y^2+v_z^2 \\ &= \sqrt{v_x^2+v_y^2+v_z^2}^2 \\ &= |v|^2 \end{aligned}

叉乘

输入两个向量,输出一个向量。又称作外积,向量积。

定义

  • 几何定义:

    a×b=absin(θ)n\vec{a} \times \vec{b} = |\vec{a}| |\vec{b}| \sin(\theta) \vec{n}

    其中θa,b的夹角,n是与a,b所构成的平面垂直的单位向量。其中 \theta 是 \vec{a},\vec{b} 的夹角,\vec{n}是与\vec{a},\vec{b}所构成的平面垂直的单位向量。

  • 代数定义:

    a×b=xyzaxayazbxbybz=x(1)1+1ayazbybz+y(1)1+2axazbxbz+z(1)1+3axaybxby=x(aybzazby)y(axbzazbx)+z(axbyaybx) \begin{aligned} \vec{a} \times \vec{b} &= \begin{vmatrix} \vec{x} & \vec{y} & \vec{z} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \end{vmatrix}\\ &= \vec{x}(-1)^{1+1}\begin{vmatrix}a_y&a_z\\b_y&b_z\end{vmatrix}+ \vec{y}(-1)^{1+2}\begin{vmatrix}a_x&a_z\\b_x&b_z\end{vmatrix}+ \vec{z}(-1)^{1+3}\begin{vmatrix}a_x&a_y\\b_x&b_y\end{vmatrix}\\ &= \vec{x}(a_yb_z - a_zb_y) - \vec{y}(a_xb_z - a_zb_x) + \vec{z}(a_xb_y - a_yb_x) \end{aligned}

    其中x,y,z分别为三维空间的三个基向量其中\vec{x},\vec{y},\vec{z} 分别为三维空间的三个基向量

意义

  • 计算与 a 和 b 相垂直向量 c。
  • c 的模长等于以 a,b 为临边的四边形面积。
  • 伸出手,掌心对准 a 和 b 的夹角,手掌应能通过弯曲模拟 a 旋转到 b 的状态,此时大拇指为旋转轴,同时也便是叉乘出的新向量 c。

性质

  • 反交换律:a×b=b×a\vec{a}\times\vec{b}=-\vec{b}\times\vec{a}
  • 乘以标量时满足:(ra)×b=a×(rb)=r(a×b)(r\vec{a})×\vec{b}=\vec{a}×(r\vec{b})=r(\vec{a}×\vec{b})

相关函数

夹角

给定任意两个向量 a\vec{a}b\vec{b} 求其夹角:

angle(a,b)=arccos(abcos(θ)ab)=arccos(dot(a,b)ab)\begin{aligned} angle(\vec{a},\vec{b}) &= \arccos(\frac{|\vec{a}||\vec{b}|\cos(\theta)}{|\vec{a}||\vec{b}|}) \\ &= \arccos(\frac{dot(\vec{a},\vec{b})}{ |\vec{a}||\vec{b}|})\\ \end{aligned}

投影

v\vec{v} 是待投影的向量,n\vec{n} 是投影到的法线,则:

project(v,n)=nnvcos(θ)=nndot(v,n)n\begin{aligned} project(\vec{v},\vec{n}) &= \frac{\vec{n}}{|\vec{n}|} * |\vec{v}| \cos(\theta)\\ &= \frac{\vec{n}}{|\vec{n}|} * \frac{dot(\vec{v},\vec{n})}{|\vec{n}|} \end{aligned}

特别当 n\vec{n} 为单位向量时:

project(v,n)=ndot(v,n)project(\vec{v},\vec{n}) = \vec{n} * dot(\vec{v},\vec{n})

旋转

给定向量 v\vec{v}n\vec{n} 为旋转轴转 θ\theta 度,求旋转后新向量:

v=project(v,n)v=vvrotate(v,n,θ)=vcos(θ)+cross(n,v)sin(θ)+v\begin{aligned} \vec{v}_\parallel &= project(\vec{v},\vec{n})\\ \vec{v}_\perp &= \vec{v} - \vec{v}_\parallel\\ rotate(\vec{v},\vec{n},\theta) &= \vec{v}_{\perp} \cos(\theta) + cross(\vec{n},\vec{v}_{\perp}) \sin(\theta) + \vec{v}_{\parallel}\\ \end{aligned}

基本原理是将 v\vec{v} 拆解成两个向量旋转的复合:一个平行旋转轴故无需旋转;一个与旋转轴垂直,可借助叉乘构建二维旋转坐标系,利用三角函数轻松求出旋转后的向量;

反射

给定向量 v\vec{v}n\vec{n} 为反射法线,则反射后的新向量为:

reflect(v,n)=v2dot(v,n)nreflect(\vec{v},\vec{n})=\vec{v} - 2* dot(\vec{v},\vec{n}) * \vec{n}

可以简单想象成将入射向量的反向量投影在法线上并乘二,再加上入射向量得到的就是出射向量了。

推导过程

以上图为例即求出 OB\vec{OB} 的值,AO\vec{AO}OP\vec{OP}的方向(后续简称 n\vec{n} ) 分别为入射角和法线。

OB=ABAO=2APAO=2(AO+OP)AO=AO+2OP=AO+2project(OA,n)=AO+2dot(AO,n)n=v2dot(v,n)n\begin{aligned} \vec{OB} &= \vec{AB}-\vec{AO} \\ &= 2\vec{AP} - \vec{AO}\\ &= 2(\vec{AO} + \vec{OP})-\vec{AO}\\ &= \vec{AO} + 2\vec{OP}\\ &= \vec{AO} + 2 * project(\vec{OA},\vec{n})\\ &= \vec{AO} + 2 * dot(-\vec{AO},\vec{n}) * \vec{n}\\ &= \vec{v} - 2 * dot(\vec{v},\vec{n}) * \vec{n} \end{aligned}

插值

lerp(a,b,t)=a+(ba)tlerp(\vec{a},\vec{b},t) = \vec{a}+(\vec{b}-\vec{a})t


【数学】向量
https://bdffzi-blog.pages.dev/posts/1182456995.html
作者
BDFFZI
发布于
2024年10月10日
许可协议