解析QTransform的用法

QTransform本质与QMatrix3x3是一样的:二维平面上任何一个平移、伸缩、旋转的操作,或者其组合,都可以用3×3矩阵表述。

那么问题来了,假如我通过QTransform对一个条线段做了组合操作,比如说,先伸缩,再旋转,我应该如何生成这样的QTransform呢?

目录

例子1

例子2


先说结论:伸缩对应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打印结果一致,说明我们对倒序的理解是正确的,否则结果将不同。

相关推荐
不会代码的小猴10 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
精英的英14 小时前
记一次 Qt5 Language Server 开发
开发语言·vscode·qt
平常心的技术小牛16 小时前
Qt-快速上手-QTextCursor
开发语言·qt
不会代码的小猴20 小时前
4. 控件学习2
开发语言·c++·笔记·qt
我是小灰灰吖20 小时前
解决高频率图像处理中的内存“只增不减”:glibc malloc_trim实战指南
linux·qt
秋田君21 小时前
QT_一个UDP通信程序(单播+广播)
开发语言·qt·udp
我是小灰灰吖21 小时前
Qt 6.9.3 Ubuntu 22.04 虚拟键盘显示问题全记录与解决方案
linux·qt·ubuntu
C++ 老炮儿的技术栈2 天前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化
Quz2 天前
QML ComboBox 可编辑输入与动态更新模型
qt
丰锋ff2 天前
7.2Qt中Json的操作
开发语言·qt·json