🛫

齐次坐标

Translation

平移变换非常特殊。
 
notion image
x=x+txy=y+ty\begin{array}{l}x^{\prime}=x+t_{x} \\ y^{\prime}=y+t_{y}\end{array}
写出来简单,但是两个式子不能写成线性变换的形式。
[xy]=[abcd][xy]\left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right]
只能写成:
[xy]=[abcd][xy]+[txty]\left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right]+\left[\begin{array}{l}t_{x} \\ t_{y}\end{array}\right]
因此平移变换并不是线性变换。
但是我们不希望将平移变换看作一个特殊的例子,那么有没有办法将缩放、错切、平移等变换用一种统一的方式来表示?
💡
在计算机科学,永远要考虑“Trade-Off”。数据结构中不同降低时间复杂度的办法都会引入空间复杂度。如果两者都能低就很好,但更多时候是非此即彼的事情。“No Free Lunch Theory”。
notion image
引入齐次坐标,可以通过增加一个维度来将平移变换也写成矩阵乘一个点的形式。
💡
向量具有平移不变性,因此后面是 (x,y,0)(x, y, 0),平移变换后也不变。
我们也可以通过 ww 分量来推出我们操作的结果:
Valid operation if w-coordinate of result is 1 or 0
  • vector + vector = vector
  • point – point = vector
  • point + vector = point
  • point + point = ?? (通过下面的定义,两个点相加,齐次坐标系下表示的是这两个点的中点)
我们对向量的 ww 扩充了定义:
(xyw)\left(\begin{array}{c}x \\y \\w\end{array}\right)是二维的点 (x/wy/w1)\left(\begin{array}{c}x / w \\y / w \\1\end{array}\right)w0w ≠ 0
 

Affine Transformations 仿射变换

Affine map = linear map + translation
(xy)=(abcd)(xy)+(txty)\left(\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right)=\left(\begin{array}{ll}a & b \\ c & d\end{array}\right) \cdot\left(\begin{array}{l}x \\ y\end{array}\right)+\left(\begin{array}{l}t_{x} \\ t_{y}\end{array}\right)
Using homogenous coordinates:
(xy1)=(abtxcdty001)(xy1)\left(\begin{array}{l}x^{\prime} \\ y^{\prime} \\ 1\end{array}\right)=\left(\begin{array}{ccc}a & b & t_{x} \\ c & d & t_{y} \\ 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right)

2D Transformations

Scale

S(sx,sy)=(sx000sy000 1 )\mathbf{S}\left(s_{x}, s_{y}\right)=\left(\begin{array}{ccc}s_{x} & 0 & 0 \\ 0 & s_{y} & 0 \\ 0 & 0 & \text { 1 }\end{array}\right)

Rotation

R(α)=(cosαsinα0sinαcosα0001)\mathbf{R}(\alpha)=\left(\begin{array}{ccc}\cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1\end{array}\right)

Translation

T(tx,ty)=(10tx01ty001)\mathbf{T}\left(t_{x}, t_{y}\right)=\left(\begin{array}{ccc}1 & 0 & t_{x} \\ 0 & 1 & t_{y} \\ 0 & 0 & 1\end{array}\right)

逆变换

notion image
notion image
notion image
由上面两张图知道,复杂的变换可以由几个简单变换组合得到。
另外变换顺序是很重要的,不满足交换律。
R45T(1,0)T(1,0)R45R_{45} \cdot T_{(1,0)} \neq T_{(1,0)} \cdot R_{45}
矩阵是从右到左运算的:
T(1,0)R45[xy1]=[101010001][cos45sin450sin45cos450001][xy1]T_{(1,0)} \cdot R_{45}\left[\begin{array}{l}x \\ y \\ 1\end{array}\right]=\left[\begin{array}{ccc}1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{ccc}\cos 45^{\circ} & -\sin 45^{\circ} & 0 \\ \sin 45^{\circ} & \cos 45^{\circ} & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y \\ 1\end{array}\right]
矩阵没有交换律,但有结合律。
An(A2(A1(x)))=AnA2A1(xy1)A_{n}\left(\ldots A_{2}\left(A_{1}(\mathbf{x})\right)\right)=\mathbf{A}_{n} \cdots \mathbf{A}_{2} \cdot \mathbf{A}_{1} \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right)
可以将 AnA2A1\mathbf{A}_{n} \cdots \mathbf{A}_{2} \cdot \mathbf{A}_{1} 结合成一个变换矩阵。
因此我们就通过组合变换矩阵,来表示一个复杂的变换。
notion image
变量也能分解,这也有好处,例如我们希望不绕着原点,而是绕着点 C 旋转,我们可以将其平移回原点,旋转,再平移到点 C,通过分解成这些变换来达到目的。
后面三维空间沿着任意轴旋转也可以这么考虑。