描述空间的点,方向,变换,相对位置等。
数学向量
行向量 \[ \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} \]
- 几何解释,
叉乘的模等于'a'、
c++ vector 练习。
- 类型精度决策
- 运算符重载,不要重载过多的运算符,只有操作符意义特别明确。
- 仅提供重要的操作
- 使用
const, 对调用者承诺不修改对象 - 成员方法与非成员方法。
- 不要使用虚函数,总之虚函数并不适合向量类。
自定义的向量操作通常没有太大意义。vector3严格要求速度,如果使用了虚函数,优化器通常不能产生成员函数的内联代码。- 虚函数需要指向虚函数表的指针。向量定义时该指针必须被初始化,并使对象的大小增加
25%。存储包含向量的大数组是一种普遍需求。这种情况下,虚函数表指针占用的空间大部分被浪费掉。
- 向量不适合信息屏蔽(使用公开方法,限制直接访问数据),
- 全局常量 0.
- 点和向量使用同一个类,怎么使用交给使用者起变量名。
- 暂时不做优化。