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

相关推荐
Quz11 小时前
QML RangeSlider 组件:范围选择与双滑块样式
qt
luoyayun36111 小时前
【Qt for Harmony】 Qt 5.12.12 鸿蒙版 Windows 交叉编译
qt·harmonyos·qt for harmony
秋田君12 小时前
Qt_常用控件使用学习
数据库·qt·学习
wWYy.12 小时前
基于Raft的分布式Kv存储项目:raft.h
开发语言·分布式·qt
茯苓gao1 天前
嵌入式开发笔记:QSerialPort 完整使用指南——从基础 API 到工程实战
笔记·嵌入式硬件·qt·学习
丁劲犇1 天前
AI辅助快速实现动态多载波PSK随机信号源
人工智能·qt·ai·sdr·多相滤波·动态生成
Quz1 天前
QML Slider 组件:基础滑块、自定义手柄、刻度标记与自定义轨道
qt
dok122 天前
zynq qt 交叉编译
开发语言·qt
龚建波2 天前
《QDebug 2026年6月》
qt