--QTransform九个元素与三种仿射变换的关系)
前面的博客QTransform使用心得三--电子地图开发中的应用-CSDN博客提到了在电子地图开发中QTransform提供了缩放、平移、旋转操作以及三者的任意组合。本篇博客从微观角度分析QTransform的9个元素与缩放、平移、旋转操作的对应关系。由于三者可以有任意多的组合不能一一列出这里只分析最有代表性的12种组合。目录锚定概念1 实操顺序先平移后缩放2 实操顺序先缩放后平移3 实操顺序先旋转再平移4 实操顺序先平移再旋转5 实操顺序先缩放再旋转6 实操顺序先旋转再缩放7 实操顺序平移-缩放-旋转8 实操顺序缩放-平移-旋转9 实操顺序旋转-平移-缩放10 实操顺序平移-旋转-缩放11 实操顺序缩放-旋转-平移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 实操顺序先旋转再平移从左向右矩阵乘法顺序点击按钮的顺序是实操的反次序先平移再旋转平移量m31m32不受旋转影响原因同2m31实操的X平移量m32实操的Y平移量R*矢量A 矢量B平移矢量B不受旋转矩阵R的影响。4 实操顺序先平移再旋转从左向右矩阵乘法顺序点击按钮的顺序是实操的反次序先旋转再平移平移量m31m32受旋转影响实操的平移矢量经历旋转变换之后在原始坐标系下投影作为m31和m32。R*(矢量A矢量B)x m11 * (x δx) m21 * (y δy)y m12 * (x δx) m22 * (y δy)故m31 m11 * δx m21 * δym32 m12 * δx m22 * δy5 实操顺序先缩放再旋转从左向右矩阵乘法顺序点击按钮的顺序是实操的反次序先旋转再缩放考虑原始坐标系下一个点(x,y)旋转变换把(x,y)转化为(注意QTransform与教科书里的矩阵是转置关系)x m11 * x m21 * yy m12 * x m22 * y实操中旋转前面还有缩放 所以 上面的x其实是x*fx,y其实是y*fy。于是有x m11 * fx * x m21 * fy * yy 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 * yy m12 * fy * x m22 * fy * y这里m11 m21 m12 m22是假设不缩放只旋转之后的结果。所以最终的结果还要乘以缩放系数m11最终的结果 m11(假如只旋转不缩放) * fxm12 m12 * fym21 m21 * fxm22 m22 * fy7 实操顺序平移-缩放-旋转从左向右矩阵乘法顺序点击按钮的顺序是实操的反次序旋转-缩放-平移从前面的分析或者从矩阵乘法表示都能看出来在任何情况下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始终为0m33始终为12 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分解是深度学习、图像压缩等领域的重要技术在后面的博客里将慢慢提到。