2.向量


描述空间的点,方向,变换,相对位置等。

  • 数学向量

    • 行向量 \[ \begin{matrix} 1&2&3 \end{matrix} \]

    • 列向量 \[ \begin{bmatrix}1\\2\\3\end{bmatrix} \]

  • 0 向量,大小为0的向量。 \[ \begin{bmatrix}0&0&0\end{bmatrix} 或者 \begin{bmatrix}0\\0\\0\end{bmatrix} \]

  • 向量和点

    • 点 只有位置
    • 向量,位置大小方向
  • 向量运算

    • 与标量的 +-*/ 运算,对每个分量单独运算. /运算需要 非0除数。 \[ k * \begin{bmatrix}1&2&3\end{bmatrix} =\begin{bmatrix}1&2&3\end{bmatrix} * k = \begin{bmatrix}1*k&2*k&3*k\end{bmatrix} \]

    • 长度/模,二维和三维的笛卡尔坐标系,分量方向分别垂直,所以符合勾股定理. \[ \begin{Vmatrix}v\end{Vmatrix} = \sqrt{v_1^2 +v_2^2+ .. + v_n^2}, n代表v向量的维数。 \]

    • 标准化向量normalize\[ v_{normal} = \frac{v}{\begin{Vmatrix}v\end{Vmatrix}}, v为非0向量。 \]

    • 向量和向量+-运算,需要同维度,对应维度向量相 +-a-b相减几何意义,b的尾直接连接a的头形成的向量. \[ \begin{bmatrix}1&2&3\end{bmatrix} + \begin{bmatrix}4&5&6\end{bmatrix} =\begin{bmatrix}4&5&6\end{bmatrix} +\begin{bmatrix}1&2&3\end{bmatrix} = \begin{bmatrix}1+4&2+5&3+6\end{bmatrix}, 行向量相加 \]

      \[ \begin{bmatrix}1\\2\\3\end{bmatrix} + \begin{bmatrix}4\\5\\6\end{bmatrix} =\begin{bmatrix}4\\5\\6\end{bmatrix} +\begin{bmatrix}1\\2\\3\end{bmatrix} = \begin{bmatrix}1+4\\2+5\\3+6\end{bmatrix} , 列向量相加 \]

      \[ \begin{bmatrix}1&2&3\end{bmatrix} - \begin{bmatrix}4&5&6\end{bmatrix} = \begin{bmatrix}1-4&2-5&3-6\end{bmatrix}, 行向量相减 \]

      \[ \begin{bmatrix}1\\2\\3\end{bmatrix} - \begin{bmatrix}4\\5\\6\end{bmatrix} = \begin{bmatrix}1-4\\2-5\\3-6\end{bmatrix} , 列向量相减 \]

    • 向量点乘 *(内积),对应分量相乘,结果相加,得到一个标量。因此需要维数相同 \[ a_n * b_n \sum_{i=1}^{n}v_i*k_i, 对应项相乘,并累加。 \]

      \[ \begin{bmatrix}1\\2\\3\end{bmatrix} * \begin{bmatrix}4\\5\\6\end{bmatrix} =\begin{bmatrix}4\\5\\6\end{bmatrix} *\begin{bmatrix}1\\2\\3\end{bmatrix} = 1*4 + 2*5 + 3*6 = 32 \]

      • 几何解释 \[ a * b =\begin{Vmatrix}a\end{Vmatrix}*\begin{Vmatrix}b\end{Vmatrix}*\cos\theta_{a,b} \]

      • 几何用途

        • 利用 0, 判断 锐角,直角和钝角。

        • \[ a * b_{normal} = a * \frac{b}{\begin{Vmatrix}b\end{Vmatrix}} = \frac{\begin{Vmatrix}a\end{Vmatrix}*\begin{Vmatrix}b\end{Vmatrix}*\cos\theta_{a,b}}{\begin{Vmatrix}b\end{Vmatrix}} =\begin{Vmatrix}a\end{Vmatrix}*\cos\theta_{a,b}, 表示 a在b上的投影。 \]

    • 向量叉乘 x, 第二位开始循环相乘 减去反对称相乘作为上一项元素。 \[ \begin{bmatrix}x_1\\y_1\\z_1\end{bmatrix} \times \begin{bmatrix}x_2\\y_2\\z_2\end{bmatrix} =\begin{bmatrix}y_1*z_2 - z_1*y_2\\z_1*x_2 - x_1*z_2\\x_1*y_2 - x_2*y_1\end{bmatrix} \]

      \[ \begin{bmatrix}1\\2\\3\end{bmatrix} \times \begin{bmatrix}4\\5\\6\end{bmatrix} =\begin{bmatrix}2*6 - 3*5\\3*4 - 1*6\\1*5 - 2*4\end{bmatrix} = \begin{bmatrix}-3\\6\\-3\end{bmatrix} \]

      • 几何解释, 叉乘的模等于'a'、b连接的平行四边形面积,方向满足左手法则,由 a的头指向,b的尾。axa = 0,ax(axb) = 0 \[ \begin{Vmatrix}a \times b\end{Vmatrix} =\begin{Vmatrix}a\end{Vmatrix}*\begin{Vmatrix}b\end{Vmatrix}*\sin\theta_{a,b} \]
    • c++ vector 练习。

      vector.h

      1. 类型精度决策
      2. 运算符重载,不要重载过多的运算符,只有操作符意义特别明确。
      3. 仅提供重要的操作
      4. 使用 const, 对调用者承诺不修改对象
      5. 成员方法与非成员方法。
      6. 不要使用虚函数,总之虚函数并不适合向量类。
        1. 自定义的向量操作通常没有太大意义。
        2. vector3严格要求速度,如果使用了虚函数,优化器通常不能产生成员函数的内联代码。
        3. 虚函数需要指向虚函数表的指针。向量定义时该指针必须被初始化,并使对象的大小增加 25%。存储包含向量的大数组是一种普遍需求。这种情况下,虚函数表指针占用的空间大部分被浪费掉。
      7. 向量不适合信息屏蔽(使用公开方法,限制直接访问数据),
      8. 全局常量 0.
      9. 点和向量使用同一个类,怎么使用交给使用者起变量名。
      10. 暂时不做优化。

文章作者: lyg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 lyg !
  目录