QTransform使用心得(四)--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 实操顺序:先旋转,再平移

从左向右矩阵乘法顺序(点击按钮的顺序)是实操的反次序:先平移,再旋转

平移量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分解是深度学习、图像压缩等领域的重要技术,在后面的博客里将慢慢提到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值