QTransform 解析

实例: 以点(100,100) 围绕点(200,150)旋转45°后的坐标, 采用QTransform 类方法实现移动变换.

Test1

采用一个QTransform 对象,通过连续的变换后,发现最后的结果与预先的不一致.

原因:

当trans1.translate(-200., -150.); 后,坐标系的原点变成了-200,-150.

之后trans1.rotate(45.); 将以(-200,-150)为原点,旋转坐标系45°.

trans1.translate(200., 150.); ,将在旋转后的坐标系下面, X轴方向偏移200,Y轴偏置150.

Test2

正确的方式:

采用多个QTransform 对象,保证每个变换对象的初始原点坐标始终是(0,0).

最后通过了将每个变换* 得到一个总的变换矩阵.

也可以单独一步一步的变换后,将上一步的结果作为下一步的输入点.

#include <QtCore/QCoreApplication>
#include <QTransform>
#include <QRectF>
#include <QDebug>
#include <QRegion>void Test1()
{qInfo() << "Test1";QPointF point(100., 100.);QTransform trans1;qInfo() << "trans1:" << trans1;trans1.translate(-200., -150.);qInfo() << "trans1:" << trans1;QPointF point1 = trans1.map(point);qInfo() << point1;trans1.rotate(45.);qInfo() << "trans1:" << trans1;QPointF point2 = trans1.map(point);qInfo() << point2;trans1.translate(200., 150.);qInfo() << "trans1:" << trans1;QPointF  point3 = trans1.map(point);qInfo() << "Test2" << point3;
}void Test2()
{qInfo() << "Test2";QPointF point(100., 100.);QTransform trans1;qInfo() << "trans1:" << trans1;trans1.translate(-200., -150.);qInfo() << "trans1:" << trans1;QPointF point1 = trans1.map(point);qInfo() << point1;QTransform trans2;qInfo() << "trans2:" << trans2;trans2.rotate(45.);qInfo() << "trans2:" << trans2;QPointF point2 = trans2.map(point1);qInfo() << point2;QTransform trans3;qInfo() << "trans3:" << trans3;trans3.translate(200., 150.);qInfo() << "trans3:" << trans3;QPointF  point3 = trans3.map(point2);qInfo() << "Test2" << point3;//方式二// Combine the transformations using chainingQTransform finalTransform = trans1 * trans2 * trans3;qInfo() << "finalTransform:" << finalTransform;QPointF  point4 = finalTransform.map(point);qInfo() << "Test2" << point4;}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Test1();Test2();return a.exec();
}

结果

Test1
trans1: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans1: QTransform(type=TxTranslate, 11=1 12=0 13=0 21=0 22=1 23=0 31=-200 32=-150 33=1)
QPointF(-100,-50)
trans1: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=-200 32=-150 33=1)
QPointF(-200,-8.57864)
trans1: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=-164.645 32=97.4874 33=1)
Test2 QPointF(-164.645,238.909)
Test2
trans1: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans1: QTransform(type=TxTranslate, 11=1 12=0 13=0 21=0 22=1 23=0 31=-200 32=-150 33=1)
QPointF(-100,-50)
trans2: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans2: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=0 32=0 33=1)
QPointF(-35.3553,-106.066)
trans3: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans3: QTransform(type=TxTranslate, 11=1 12=0 13=0 21=0 22=1 23=0 31=200 32=150 33=1)
Test2 QPointF(164.645,43.934)
finalTransform: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=164.645 32=-97.4874 33=1)
Test2 QPointF(164.645,43.934)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LoveDA: 遥感土地覆盖数据集的领域自适应语义分割

引入了土地覆盖域自适应语义分割(LoveDA)数据集来推进语义和可转移学习。LoveDA数据集包含来自三个不同城市的5987张高分辨率图像和166768个带注释的对象。与现有数据集相比&#xff0c;LoveDA数据集包含两个领域(城市和农村)&#xff0c;这带来了相当大的挑战&#xff0c;因为…

华为OD机试题-贪心歌手

题目解析 题目描述&#xff1a; 歌手准备从 A 城去 B 城参加演出 按照合同&#xff0c;他必须在 T 天内赶到。歌手途径 N 座城市。歌手不能往回走。每两座城市之间需要的天数都可以提前获知。歌手在每座城市都可以在路边卖唱赚钱。经过调研&#xff0c;歌手提前获知了每座城市…

C# AOP面向切面编程

AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;旨在将横切关注点&#xff08;Cross-cutting Concerns&#xff09;从业务逻辑中分离出来。在传统的面向对象编程中&#xff0c;横切关注点&#xff08;如日志记录、…

R包:蛋白质组学质控评估PTXQC包

介绍 PTXQC包是2016年发表在J Proteome Res期刊上的R包&#xff0c;它主要是对MaxQuant输出结果进行提取处理从而获得评估蛋白质质量结果。 安装 从github安装&#xff0c;安装过程会自动构建tutorial。 devtools::install_github("cbielow/PTXQC", build_vignet…

AI数字人直播saas系统源码部署火爆!无人直播系统全攻略

随着直播行业的日益兴盛&#xff0c;各种直播模式和玩法不断涌现。其中&#xff0c;AI数字人直播更是凭借着其在降本增效的独特优势而在众多直播模式中脱颖而出&#xff0c;成为了众多企业已经引进或计划引进的新型技术。而各大数字人源码厂商推出的AI数字人直播saas系统源码部…

面试题07-09

知道了 InnoDB 的索引实现后&#xff0c;就很容易明白为什么不建议使用过长的字段作为主键&#xff0c;因为所有辅助索引都引用主索引&#xff0c;过长的主索引会令辅助索引变得过大。再例如&#xff0c;用非单调的字段作为主键在 InnoDB 中不是个好主意&#xff0c;因为 InnoD…

走拼箱货必看海运拼箱的实用技巧

在国际海运运输中&#xff0c;海运拼箱适用于货物数量较少或体积不足以填满整个集装箱的情况。 海运拼箱货物通常由物流公司或货代进行组织和管理。多个货主的货物通过合理拼装&#xff0c;使集装箱空间得到充分利用。 那么&#xff0c;在海运拼箱和整柜有哪些不同&#xff0c…

Linux -- 认识gcc/g++、代码的编译过程

目录 前言&#xff1a; 使用 gcc/g&#xff1a; 代码的编译过程&#xff1a; 预处理&#xff1a; 头文件展开&#xff1a; 宏替换去注释&#xff1a; ​编辑 条件编译&#xff1a; 编译&#xff1a; 汇编&#xff1a; 链接&#xff1a; 动态库&#xff08;动态链…

使用Simulink基于模型设计(二):系统定义和布局

Simulink模型的顶层系统布局是许多工程团队可以使用的公共环境&#xff0c;是基于模型的设计范式&#xff1a;分析、设计、检验和实现。您可以通过确定模型的结构和各个组件来定义顶层系统。然后&#xff0c;您可以将模型按照层次结构进行组织&#xff0c;分别与系统的各个组件…

【鸿蒙学习笔记】交互事件

官方文档&#xff1a;交互事件 目录标题 分类交互事件-触屏交互事件-手势事件单一手势 分类 交互事件-触屏 在组件上按下(Down) , 滑动(Move) , 抬起(up)时触发的回调事件。包括点击事件、触摸事件和拖拽事件 交互事件-手势事件 在手机上点击打开应用 , 长按后拖动应用 , 这…

自动化数据集成的BI工具,为你提供决策洞察力

传统的商业智能&#xff08;BI&#xff09;报表系统采用的是“业务提报表需求&#xff0c;IT进行开发”的模式。决策管理者和业务人员提出用报表等来展示经营管理数据的需求&#xff1b;接着IT响应需求&#xff0c;进行需求沟通、数据处理加工、报表开发等主体工作&#xff1b;…

使用java代码取本月第一个工作日

根据参数或当前月&#xff0c;获取本月第一个工作日 文章目录 根据参数或当前月&#xff0c;获取本月第一个工作日前言一、根据当前日期获取当前月的第一个工作日二、根据参数日期&#xff0c;获取参数月的第一个工作日。总结 前言 这里我们列举两个方法&#xff1a; 1、没有参…

RFID资产管理系统 RFID固定资产管理系统

大多数企业都曾被固定资产管理“难”的问题困扰&#xff1a;账物不符、查询不便、盘点耗时……因此&#xff0c;越来越多的企业选择用资产管理系统&#xff0c;来实现资产智能化管理。 RFID资产管理系统方案是针对大多数企业存在的资产管理痛点&#xff0c;采用RFID技术&#…

uni-app三部曲之三: 路由拦截

1.引言 路由拦截&#xff0c;个人理解就是在页面跳转的时候&#xff0c;增加一级拦截器&#xff0c;实现一些自定义的功能&#xff0c;其中最重要的就是判断跳转的页面是否需要登录后查看&#xff0c;如果需要登录后查看且此时系统并未登录&#xff0c;就需要跳转到登录页&…

Python地震波逆问题解构算法复杂信号分析

&#x1f3af;要点 &#x1f3af;时域、时频域以及时间和频率相关联偏振特性分析三种算法 | &#x1f3af;时域波参数估计算法 | &#x1f3af;机器学习模型波形指纹分析算法 | &#x1f3af;色散曲线和频率相关波分析算法 | &#x1f3af;动态倾斜校正算法 | &#x1f3af;声…

【JS|第21期】JavaScript模块化:深入解析三种文件暴露方式

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

前后端项目部署方案汇总

前端项目 1、本地打包部署 # 本地打包部署到线上服务器 npm run build && \ rsync -r ./dist/* root127.0.0.1:/www/www.demo.com/www2、服务器端打包部署 步骤 拉取代码 -> 安装依赖 -> 打包编译 -> 拷贝到运行目录 -> 发送成功消息shell命令 git pu…

新手小白报考学习PMP会遇到哪些“坑”?

PMP考试的陷阱实际上与其他大型证书考试差不多&#xff0c;主要是在选择培训机构和各种收费方面会遇到一些坑。 首先&#xff0c;并不是每个人都能经历这些坑&#xff0c;因为PMP考试有一定的门槛。 作为引进国外的考试&#xff0c;报名都有中英文之分&#xff0c;所以先来看…

STM32的 DMA(直接存储器访问) 详解

STM32的DMA&#xff08;Direct Memory Access&#xff0c;直接存储器存取&#xff09;是一种在单片机中用于高效实现数据传输的技术。它允许外设设备直接访问RAM&#xff0c;不需要CPU的干预&#xff0c;从而释放CPU资源&#xff0c;提高CPU工作效率&#xff0c;本文基于STM32F…

[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_f…