只用几个数,记下一张图的任意变形?
你在做一个小游戏,主角是这张笑脸。美术给了几十种变形:拉宽、压扁、倾斜、旋转、翻面……每一种都存一整张图,太浪费了。
这些变形有个共同点:都是「均匀」的,整张图各处变得一样。那么,能不能只用几个数,就把任意一种这样的变形记下来?
先猜一下:最少需要几个数?
拖动绿色和橙色箭头的端点。
回头看:你刚才一共动了什么?
只动了两个箭头的端点。每个端点是一个点,有 2 个坐标,所以一共 4 个数。可整张笑脸、整片网格都跟着变了。
这很奇怪:为什么两个箭头就能决定整张图的样子?平面上有无数个点,凭什么只看 $\mathbf{i}$、$\mathbf{j}$ 这两个就够了?
什么样的变形,能被两个箭头决定?
再拖一拖下面的箭头,盯着网格看:原点动过吗?直线有没有弯?平行的线还平行吗?间距还相等吗?
选一个向量 $\mathbf{v}$,看它被送到哪里:
定义(线性变换) 平面的一种变形,如果满足:原点不动;网格线变形后仍是直线,而且仍然平行、等距,就叫线性变换。
用式子说:对任意向量 $\mathbf{u},\mathbf{v}$ 和数 $a,b$,$\;T(a\mathbf{u}+b\mathbf{v}) = a\,T(\mathbf{u}) + b\,T(\mathbf{v})$。
关键在这里:任何向量都能拆成 $\begin{pmatrix}x\\y\end{pmatrix} = x\,\mathbf{i} + y\,\mathbf{j}$。线性变换保持这种「几份加几份」的关系,所以
$T\begin{pmatrix}x\\y\end{pmatrix} = x\,T(\mathbf{i}) + y\,T(\mathbf{j})$
只要知道 $\mathbf{i}$、$\mathbf{j}$ 去了哪里,其他每个点去哪里都定了。这就是两个箭头够用的原因。
定义(矩阵) 把 $T(\mathbf{i})$、$T(\mathbf{j})$ 竖着并排写在一起,就是这个变换的矩阵:
$A = \begin{pmatrix} a & b \\ c & d \end{pmatrix},\quad \text{第一列 } \begin{pmatrix}a\\c\end{pmatrix} = T(\mathbf{i}),\ \ \text{第二列 } \begin{pmatrix}b\\d\end{pmatrix} = T(\mathbf{j})$
矩阵乘向量就是「$x$ 份第一列 + $y$ 份第二列」:$\;A\begin{pmatrix}x\\y\end{pmatrix} = x\begin{pmatrix}a\\c\end{pmatrix} + y\begin{pmatrix}b\\d\end{pmatrix} = \begin{pmatrix}ax+by\\cx+dy\end{pmatrix}$
第 4 关里你见过的那张「系数表」,和这里的矩阵是同一个东西。同一张表,两种读法。
回到最初的问题:直接写出 4 个数
这次不拖了。先想「$\mathbf{i}$ 该去哪?$\mathbf{j}$ 该去哪?」,再把答案写成两列。
你刚才用的方法:把「这张图要怎么变」翻译成「$\mathbf{i}$、$\mathbf{j}$ 要去哪」,然后写成两列。整个问题就是这样被定义解决的。
一开始的「最少几个数」,答案是 4 个:均匀的变形(线性变换)和 $2\times 2$ 矩阵一一对应。
这套定义和方法,还能解决什么?
旋转任意角度
提示:$\mathbf{i}$ 转 θ 后落在单位圆上的哪一点?$\mathbf{j}$ 呢?
$\mathbf{i}$ 转到 $(\cos\theta,\ \sin\theta)$,$\mathbf{j}$ 转到 $(-\sin\theta,\ \cos\theta)$,所以 $\;R_\theta = \begin{pmatrix}\cos\theta & -\sin\theta \\ \sin\theta & \cos\theta\end{pmatrix}$。你不需要背它,因为随时能用「$\mathbf{i}$、$\mathbf{j}$ 去哪」推出来。
同一个方法,到处都在用
屏幕上每个物体的旋转、缩放、翻转,都是一个矩阵乘在它所有顶点上。显卡每秒做几十亿次这样的乘法。
三维里有 $\mathbf{i},\mathbf{j},\mathbf{k}$ 三个箭头,所以是 $3\times 3$ 矩阵,三列是它们的去向。想法完全一样。
解 $A\mathbf{x}=\mathbf{b}$,换个读法就是问:哪个向量被 $A$ 送到了 $\mathbf{b}$?有时无解、有时无穷多解,第 7 关会从这个角度看清原因。
什么时候,这套方法用不了?
知道一个工具的边界,才算真的懂它。下面三个变形,看看矩阵能不能做到。
1. 把笑脸往右平移 2 格
做不到。不管矩阵是什么,$A\begin{pmatrix}0\\0\end{pmatrix} = 0\cdot T(\mathbf{i}) + 0\cdot T(\mathbf{j}) = \begin{pmatrix}0\\0\end{pmatrix}$:原点永远不动。而平移恰恰要把原点也挪走。
以后会看到一个巧妙的办法:多加一维,用 $3\times 3$ 矩阵来表示平面上的平移(齐次坐标)。游戏引擎就是这么做的。
2. 把笑脸弯成波浪
不能。线性变换要求网格线变形后还是直线,还要平行、等距。波浪把直线弄弯了,所以它不是线性变换,任何 4 个数都描述不了。描述弯曲的变形需要别的工具(以后的「非线性」与微积分里的「局部看起来是线性的」)。
3. 把笑脸压成一条线,再变回来
不能。压扁之后,很多不同的点落在了同一个点上(比如 $(2,0)$ 和 $(0,1)$ 都到了 $(2,1)$)。一个点不可能再同时变回两个点,信息丢了。什么时候能「撤销」、怎么一眼看出会不会被压扁,是第 7 关(逆矩阵)和第 8 关(行列式)要回答的问题。
自己讲一遍
用一两句你自己的话说:矩阵到底是什么?它什么时候管用,什么时候不管用?