Translation
平移变换非常特殊。
x′=x+txy′=y+ty写出来简单,但是两个式子不能写成线性变换的形式。
[x′y′]=[acbd][xy]只能写成:
[x′y′]=[acbd][xy]+[txty]因此平移变换并不是线性变换。
但是我们不希望将平移变换看作一个特殊的例子,那么有没有办法将缩放、错切、平移等变换用一种统一的方式来表示?
💡
在计算机科学,永远要考虑“Trade-Off”。数据结构中不同降低时间复杂度的办法都会引入空间复杂度。如果两者都能低就很好,但更多时候是非此即彼的事情。“No Free Lunch Theory”。
引入齐次坐标,可以通过增加一个维度来将平移变换也写成矩阵乘一个点的形式。
💡
向量具有平移不变性,因此后面是
(x,y,0),平移变换后也不变。
我们也可以通过
w 分量来推出我们操作的结果:
Valid operation if w-coordinate of result is 1 or 0
- point + point = ?? (通过下面的定义,两个点相加,齐次坐标系下表示的是这两个点的中点)
⎝⎛xyw⎠⎞是二维的点
⎝⎛x/wy/w1⎠⎞,
w=0
Affine Transformations 仿射变换
Affine map = linear map + translation
(x′y′)=(acbd)⋅(xy)+(txty)Using homogenous coordinates:
⎝⎛x′y′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⋅⎝⎛xy1⎠⎞2D Transformations
Scale
S(sx,sy)=⎝⎛sx000sy000 1 ⎠⎞Rotation
R(α)=⎝⎛cosαsinα0−sinαcosα0001⎠⎞Translation
T(tx,ty)=⎝⎛100010txty1⎠⎞逆变换
由上面两张图知道,复杂的变换可以由几个简单变换组合得到。
另外变换顺序是很重要的,不满足交换律。
R45⋅T(1,0)=T(1,0)⋅R45矩阵是从右到左运算的:
T(1,0)⋅R45⎣⎡xy1⎦⎤=⎣⎡100010101⎦⎤⎣⎡cos45∘sin45∘0−sin45∘cos45∘0001⎦⎤⎣⎡xy1⎦⎤矩阵没有交换律,但有结合律。
An(…A2(A1(x)))=An⋯A2⋅A1⋅⎝⎛xy1⎠⎞可以将
An⋯A2⋅A1 结合成一个变换矩阵。
因此我们就通过组合变换矩阵,来表示一个复杂的变换。
变量也能分解,这也有好处,例如我们希望不绕着原点,而是绕着点 C 旋转,我们可以将其平移回原点,旋转,再平移到点 C,通过分解成这些变换来达到目的。
后面三维空间沿着任意轴旋转也可以这么考虑。