【数学】向量

【数学】向量

向量的运算

点乘

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

定义

  • 几何定义:\(\vec{a} \cdot{} \vec{b} = |\vec{a}| |\vec{b}| \cos(\theta)\)
  • 代数定义:\(\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。

性质

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

变形

  • \(\vec{v} \cdot \vec{v}= |\vec{v}|^2\)

    \( \begin{aligned} v \cdot 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} \)

叉乘

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

定义

  • 几何定义:

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

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

  • 代数定义:

    \( \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} \)

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

意义

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

性质

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

夹角

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

\[\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} \]

投影

\(\vec{v}\) 是待投影的向量,\(\vec{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} \]

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

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

旋转

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

\[\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} \]

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

反射

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

\[reflect(\vec{v},\vec{b})=\vec{v} - 2* dot(\vec{v},\vec{n}) * \vec{n} \]

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

推导过程

alt text

以上图为例即求出 \(\vec{OB}\) 的值,\(\vec{AO}\)\(\vec{OP}\)的方向(后续简称 \(\vec{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} \]

posted @ 2025-02-23 20:30  BDFFZI  阅读(58)  评论(0)    收藏  举报