仿射变换是线性变换+平移矢量。
[x′y′]=[xy]⋅[acbd]+[ef]
它可以应用于单个点或线,甚至可以应用于贝塞尔曲线。对于线,它保留了平行线保持平行的属性。对于贝塞尔曲线,它保留了控制点的凸包属性。
相乘后,它产生2个方程,从原始对和常数列表产生一个“变换的”坐标对。。
(X ,Ý )(一个,b ,c ^ ,d ,ê ,˚F )X ' = 一个⋅ X + C ^ ⋅ ÿ + È(x′,y′)(x,y)(a,b,c,d,e,f)
x′=a⋅x+c⋅y+ey′=b⋅x+d⋅y+f
可以方便地将线性变换和平移矢量放到一个3D矩阵中,该矩阵可以在2D同构坐标上进行运算。
[x′y′1]=[xy1]⋅⎡⎣⎢acebdf001⎤⎦⎥
上面的方程式相同。
非常方便的是,矩阵本身可以相乘以生成第三矩阵(常数),该矩阵执行与原始2依次执行的变换相同的变换。简单地说,矩阵乘法是关联的。
[x′′y′′1]=====⎛⎝⎜[xy1]⋅⎡⎣⎢acebdf001⎤⎦⎥⎞⎠⎟⋅⎡⎣⎢gikhjm001⎤⎦⎥[a⋅x+c⋅y+eb⋅x+d⋅y+f1]⋅⎡⎣⎢gikhjm001⎤⎦⎥⎡⎣⎢g(a⋅x+c⋅y+e)+i(b⋅x+d⋅y+f)+kh(a⋅x+c⋅y+e)+j(b⋅x+d⋅y+f)+m1⎤⎦⎥T[xy1]⋅⎛⎝⎜⎡⎣⎢acebdf001⎤⎦⎥⋅⎡⎣⎢gikhjm001⎤⎦⎥⎞⎠⎟[xy1]⋅⎡⎣⎢ag+bicg+dieg+fi+kah+bjch+djeh+fj+m001⎤⎦⎥
或者,您可以考虑一些基本的转换类型,并通过组合这些基本转换类型(将它们相乘)来组成任何更复杂的转换。
身份转换
⎡⎣⎢100010001⎤⎦⎥
缩放比例
⎡⎣⎢Sx000Sy0001⎤⎦⎥
*注意:可以使用缩放参数或进行反射。(Sx,Sy)=(−1,1)(1,−1)
翻译
⎡⎣⎢10Tx01Ty001⎤⎦⎥
歪斜x y
⎡⎣⎢100Qx10001⎤⎦⎥
歪斜y x
⎡⎣⎢1Qy0010001⎤⎦⎥
回转
⎡⎣⎢cosθsinθ0−sinθcosθ0001⎤⎦⎥
[注意,我在这里显示了Matrix的形式,它在左边接受行向量。这些矩阵的转置将与右侧的列向量一起使用。]
纯粹由缩放,旋转和平移组成的矩阵可以分解回这三个分量。