前面的博客QTransform使用心得(三)--电子地图开发中的应用-CSDN博客
提到了,在电子地图开发中,QTransform提供了缩放、平移、旋转操作以及三者的任意组合。本篇博客从微观角度分析QTransform的9个元素与缩放、平移、旋转操作的对应关系。由于三者可以有任意多的组合,不能一一列出,这里只分析最有代表性的12种组合。
目录
锚定概念
矩阵变换改变的是坐标,坐标系从来都是不动的。X' = A * X。这里X是变换前的坐标,X'是变换后的坐标。X与X'两者在同一个坐标系里,也就是初始坐标系。所有操作的参考系都是初始坐标系。
1 实操顺序:先平移,后缩放
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先缩放,后平移。
考虑坐标(x,y)。平移后坐标变为(x+δx, y+δy)。缩放发生在平移之后,是对(x+δx, y+δy)的缩放。所以缩放结果是:
m31=实操的X平移量乘以缩放倍数;
m32=实操的Y平移量乘以缩放倍数,
m11和m22按照缩放倍数变化
2 实操顺序:先缩放,后平移
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先平移,后缩放。
由于平移发生在缩放之后,所以不受缩放影响。
m31=实操的X平移量;
m32=实操的Y平移量;
m11和m22按照倍数变化
3 实操顺序:先旋转,再平移
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先平移,再旋转
平移量m31,m32不受旋转影响,原因同2:
m31=实操的X平移量;
m32=实操的Y平移量
R*矢量A + 矢量B
平移矢量B不受旋转矩阵R的影响。
4 实操顺序:先平移,再旋转
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先旋转,再平移
平移量m31,m32受旋转影响:实操的平移矢量经历旋转变换之后,在原始坐标系下投影,作为m31和m32。
R*(矢量A+矢量B)
x' = m11 * (x + δx) + m21 * (y + δy)
y' = m12 * (x + δx) + m22 * (y + δy)
故
m31 = m11 * δx + m21 * δy
m32 = m12 * δx + m22 * δy
5 实操顺序:先缩放,再旋转
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先旋转,再缩放
考虑原始坐标系下一个点(x,y),旋转变换把(x,y)转化为(注意QTransform与教科书里的矩阵是转置关系):
x' = m11 * x + m21 * y
y' = m12 * x + m22 * y
实操中,旋转前面还有缩放, 所以 上面的x其实是x*fx,y其实是y*fy。于是有
x' = m11 * fx * x + m21 * fy * y
y' = m12 * fx * x + m22 * fy * y
所以,x对x'的影响,以及x对y'的影响,都要乘以x的缩放系数fx;
y对x'的影响,以及y对y'的影响,都要乘以y的缩放系数fy;
简单的说,先缩放,再旋转的情况下,旋转相关的四个系数都要受源坐标(输入端)的缩放影响。所以缩放的作用体现在输入坐标侧(矩阵的列乘以对应的缩放系数)
6 实操顺序:先旋转,再缩放
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先缩放,再旋转
同理,由于缩放发生在旋转之后,所以缩放作用于输出坐标侧--矩阵的行乘以对应的缩放系数:
x' = m11 * fx * x + m21 * fx * y
y' = m12 * fy * x + m22 * fy * y
这里m11 m21 m12 m22是假设不缩放,只旋转之后的结果。所以最终的结果还要乘以缩放系数:
m11(最终的结果) = m11(假如只旋转,不缩放) * fx
m12 = m12 * fy
m21 = m21 * fx
m22 = m22 * fy
7 实操顺序:平移-缩放-旋转
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:旋转-缩放-平移
从前面的分析,或者从矩阵乘法表示都能看出来,
在任何情况下,m31都代表x' = 系数 * x + 系数 * y + 常数 里面的常数部分;
在任何情况下,m32都代表y' = 系数 * x + 系数 * y + 常数 里面的常数部分。
故平移-缩放操作后产生的m31和m32,构成一个矢量(m31,32),继续被旋转操作变换。而m11 m21 m12 m22的赋值与前面先缩放,再旋转的情况没有区别。
8 实操顺序:缩放-平移-旋转
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:旋转-平移-缩放
由于平移发生在缩放之后,所以m31和m32只受旋转变换影响。
而m11 m21 m12 m22的赋值与前面先缩放,再旋转没有区别
9 实操顺序:旋转-平移-缩放
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:缩放-平移-旋转
由于平移发生在旋转之后,所以m31和m32只受缩放变换影响。
而m11 m21 m12 m22的赋值与前面先旋转,再缩放没有区别
10 实操顺序:平移-旋转-缩放
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:缩放-旋转-平移
平移先受到旋转影响,再受到缩放影响。
假如平移量是(δx,δy),那么这个量也受到旋转和缩放变换,变换结果就是m31 m32
而m11 m21 m12 m22的赋值与前面先旋转,再缩放没有区别
11 实操顺序:缩放-旋转-平移
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:平移-旋转-缩放
平移是最后的操作,既不受缩放影响,也不受旋转影响。(m31 m32)=(δx,δy)
而m11 m21 m12 m22的赋值与前面先缩放,再旋转没有区别
12 实操顺序:旋转-缩放-平移
从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:平移-缩放-旋转
平移是最后的操作,既不受缩放影响,也不受旋转影响。(m31 m32)=(δx,δy)
而m11 m21 m12 m22的赋值与前面先旋转,再缩放没有区别
总结
对于仿射变换的组合,
1 m13和m23始终为0,m33始终为1
2 m11 m12 m21 m22由旋转和缩放决定,按照次序依次相乘得出,不受平移影响
3 m31和m32不仅受平移影响,有可能受缩放和旋转影响。假如一个QTransform由一系列旋转、缩放、平移组成,则:
· 每一次平移对m31和m32造成的效果,都等于这次平移之后的所有缩放、旋转操作(所谓“之后”,是按实操次序来说)对此次平移矢量变换后的结果;
· 最终的m31和m32是每一次平移效果的总和。
承前启后
从上面的结论来看,平移对m11 m12 m21 m22没有影响。而且即使不考虑平移,也可以有许多不同的缩放-旋转组合,生成同样的一个m11 m12 m21 m22的2×2矩阵。所以,只知道m11 m12 m21 m22是不能唯一确定对应的缩放-旋转组合的。但是,线性代数里有一个名叫“SVD分解”的操作,可以把一个矩阵唯一的分解为
旋转矩阵 x 缩放矩阵 x 旋转矩阵
的形式。SVD分解是深度学习、图像压缩等领域的重要技术,在后面的博客里将慢慢提到。
--QTransform九个元素与三种仿射变换的关系&spm=1001.2101.3001.5002&articleId=163874097&d=1&t=3&u=ae4dc977cdaf42549f759a0f3ae161dc)
1449

被折叠的 条评论
为什么被折叠?



