首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

巧用 QLineF 从 QTransform 提取角度

编程知识
2024年07月25日 21:26

我们在对 QGraphicsItem 进行变换时,QT 提供了很多便捷的方法。但当我们想获取当前变换的角度时却有些困难,因为 QTransform 没有提供获取角度的方法。在文章Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分析 分析过,使用 QTransform 进行多种变换组合后,由于组合顺序不能预知、组合数量不能预知,很难从 QTransform 矩阵中推算出当前变换的角度。即使推算出来,由于切变、缩放等变换的影响,推算出的角度也不准确。结合 QLineF 可以有个简便的方式来倒推变换角度。

一、从 QGraphicsItem 的变换说起

对 QGraphicsItem 进行变换有三种方式:

1. 使用 setRotation() 或 setScale();
2. 使用 setTransform();
3. 使用 setTransformations();

如果同时使用多种方式,变换效果将进行叠加。变换按照固定的顺序进行:

  • 第一步:应用 transform() 指定的变换;
  • 第二步:应用 transformations() 指定的变换;
  • 第三步:应用 rotation(), transformOriginPoint() 指定的变换;
  • 第四步:应用 scale(), transformOriginPoint() 指定的变换;

如果使用 setTransform() 指定旋转角度 A,再使用 setRotation() 指定旋转角度 B,那么 QGraphicsItem 旋转的角度就是 A + B。使用 rotation() 获取的角度值是 B;角度 A 只能从 transform() 中推算。然后使用 resetTransform() 复位的是 transform(),rotation() 中的角度仍然保留,那么此时 QGraphicsItem 旋转的角度就是 B 。也就是说三种变换方式数值的变换相互不影响。

对于有父子关系的 QGraphicsItem 父项目的变换将累加到子项目(即使在父项目中使用的是setRotation()方式进行的变换,叠加到子项目时只能从transform中获取该角度,并不会影响到子项目的 rotation()),子项目通过方法 sceneTransform() 获取所有累加的变换,通过 scenePos() 获取子项目在 scene 上的坐标。

二、解析 QGraphicsItem 当前旋转的角度

  1. 直接作用于 QGraphicsItem 的角度

不考虑父节项目对 QGraphicsItem 的影响,或者 QGraphicsItem 没有父项目时,计算 QGraphicsItem 当前旋转的角度,需要分别考虑 setRotation()、setTransform() 和 setTransformations() 设置的角度,分别计算后再进行累加即可。如果 QGraphicsItem 没有父项目,可以使用 sceneTransform() 获取所有累加变换后的 transform,从 transform 推算角度。

  1. 有父项目的 QGraphicsItem 的角度

考虑父项目对 QGraphicsItem 的变换影响,直接使用 sceneTransform() 获取所有累加变换后的 transform,再推算角度。

三、使用 QLineF 从 transform 提取角度

QLineF 提供的方法 angleTo() 可以帮助我们方便的计算2条直线间的夹角。要从 transform 中计算角度,可以先构建一条直线,然后使用 QTransform 的 map() 方法对直线进行变换。变换后的直线与原直线间的夹角就是 transform 旋转的角度。示例代码如下:

QTransform trans = item->sceneTransform();
QLineF line1{{0,0},{1,0}};
QLineF line2 = trans.map(line1);
qreal angle = line2.angleTo(line1)

注意:如果 transform 中执行过 shear 变换,该方法推算出来的角度不是原来设置的角度。

From:https://www.cnblogs.com/ITnoteforlsy/p/18324271
本文地址: http://www.shuzixingkong.net/article/433
0评论
提交 加载更多评论
其他文章 从DDPM到DDIM(三) DDPM的训练与推理
从DDPM到DDIM(三) DDPM的训练与推理 前情回顾 首先还是回顾一下之前讨论的成果。 扩散模型的结构和各个概率模型的意义。下图展示了DDPM的双向马尔可夫模型。 其中\(\mathbf{x}_T\)代表纯高斯噪声,\(\mathbf{x}_t, 0 < t < T\) 代表中间的
从DDPM到DDIM(三) DDPM的训练与推理 从DDPM到DDIM(三) DDPM的训练与推理 从DDPM到DDIM(三) DDPM的训练与推理
iOS开发基础142-广告归因
IDFA IDFA是苹果为iOS设备提供的一个唯一标识符,专门用于广告跟踪和相关的营销用途。与之对应的,在Android平台的是谷歌广告ID(Google Advertising ID)。 IDFA的工作原理: IDFA是分配给每个设备的唯一标识符,广告商和开发者可以利用IDFA跟踪用户对广告的点击
使用threejs实现3D卡片菜单
成品效果: 用到的技术:vue2、three.js、gsap.js template <template> <div id="box" class="container"></div> </template> s
使用threejs实现3D卡片菜单
面试官:聊聊你对分库分表的理解?
在 MySQL 集群架构中有两种主流的集群实现,一种是读写分离,而另外一种则是数据分片。所谓的数据分片其实就是今天要聊的分库分表技术。 分库分表技术不但是日常工作中用于解决数据库中的数据量会急剧增长,解决单库单表性能瓶颈的一种方案,更是面试中的高频知识点。 在阿里巴巴的《Java 开发手册》中规定:
面试官:聊聊你对分库分表的理解? 面试官:聊聊你对分库分表的理解? 面试官:聊聊你对分库分表的理解?
Llama 3.1 - 405B、70B 和 8B 的多语言与长上下文能力解析
Llama 3.1 发布了!今天我们迎来了 Llama 家族的新成员 Llama 3.1 进入 Hugging Face 平台。我们很高兴与 Meta 合作,确保在 Hugging Face 生态系统中实现最佳集成。Hub 上现有八个开源权重模型 (3 个基础模型和 5 个微调模型)。 Llama
java开发,入职第一天都干什么,带提前了解
2024.7.24,帝都今晚大雨,在雨声磅礴的夜晚适合干什么,没错适合敲代码,写博客,今晚来聊下入职一个新公司,第一天都干什么。 无论是刚毕业的新手小白,还是工作十余年的职场老人,入职一家新公司,只要还是做研发,那么毫无疑问,在领到电脑后,第一件事就是要装环境,装环境估计要花小半天或半天的时间,接下
java开发,入职第一天都干什么,带提前了解 java开发,入职第一天都干什么,带提前了解 java开发,入职第一天都干什么,带提前了解
Java代码实现七夕魔方照片墙
本文详细介绍了Java代码实现七夕魔方照片墙的方法,本文提供一个简化的Java后端示例,用于生成一个模拟的“照片墙”数据模型,并给出一个基本的前端HTML页面来展示这些数据;本文还提供了创建一个简单的REST API来提供照片数据,并构建一个前端页面来动态展示这些数据。
Java代码实现七夕魔方照片墙
手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT?
就在昨晚,Meta发布了可以与OpenAI掰手腕的最新开源大模型:Llama 3.1。 该模型共有三个版本: 8B 70B 405B 对于这次发布,Meta已经在超过150个涵盖广泛语言范围的基准数据集上评估了性能。此外,Meta还进行了广泛的人工评估,在现实场景中将Llama 3.1与竞争模型进行
手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT? 手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT? 手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT?