QTransform本质与QMatrix3x3是一样的:二维平面上任何一个平移、伸缩、旋转的操作,或者其组合,都可以用3×3矩阵表述。
那么问题来了,假如我通过QTransform对一个条线段做了组合操作,比如说,先伸缩,再旋转,我应该如何生成这样的QTransform呢?
目录
先说结论:伸缩对应QTransform::scale,旋转对应QTransform::rotate,平移对应QTransform::translate。你的操作反映到QTransform上是++倒序++的--比如前文所说的先伸缩,再旋转,那么应先声明QTransform,再调用rotate,再调用scale
看下面两个例子
例子1
坐标为(100,50)的点,沿X方向拉伸2倍,然后顺时针旋转45°。
QTransform经历了下述变换:
cpp
QTransform transform;
transform.rotate(45);
transform.translate(2,1);
既然是先拉伸,那么原来的(100,50)就变成了(200,50)
然后让(200,50)绕着原点(原点不会因为拉伸而移动)旋转45°。也就是让(0,0)-(200,50)的连线顺时针旋转45°。
这就要计算(0,0)-(200,50)的连线与X轴的夹角阿尔法:
利用python计算:α = numpy::arctan(50/200) = arctan(0.25)=0.245
显然,旋转后的线段与Y轴夹角β = 45° - 阿尔法 = arctan(1) - arctan(0.25)=0.54
而(0,0)-(200,50)的连线的长度可以用勾股定理获得:l = 206.155
于是解这个一个角等于0.54弧度,斜边等于206的直角三角形,得到旋转后的点变为:
106.066 176.777
而运行Qt程序,点击旋转后的点来打印该点坐标(下图左边棕色圆圈圈住的端点),打印的结果也是(106,177),见下图最下方的红色圆圈:

上图中,左边紫色圆圈标记的是变换前的点,即(100,50)
可见我们对QTransform的理解(操作倒序)是正确的。因为如果按照先旋转,再缩放来计算变换后的坐标,结果是不同的。
例子2
还是变换(100,50)。这次先沿X轴平移10,沿Y轴平移40;然后沿X压缩50%;最后逆时针旋转15°
平移后,坐标变为(110,90)
然后压缩,变为(55,90)
接下来旋转,计算思路就与例子1类似了。这里不赘述。python计算结果与Qt打印结果一致,说明我们对倒序的理解是正确的,否则结果将不同。
