「QT」几何数据类 之 QVector4D 四维向量类

news2024/11/27 12:27:49

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明
「Py」Python程序设计「Math」探秘数学世界

目录

    • Qt中QVector4D类详解(基于Qt 5.15版本)
      • 一、类的引言
      • 二、使用范围
      • 三、类的头文件
      • 四、类的继承
      • 五、类的构造介绍
      • 六、共有函数介绍
      • 七、static函数介绍
      • 八、运算符重载
      • 九、详细代码举例

Qt中QVector4D类详解(基于Qt 5.15版本)

一、类的引言

QVector4D类是Qt框架中用于表示和操作四维向量或顶点的核心类。它广泛应用于3D图形渲染、物理模拟、动画以及任何需要四维空间表示的领域。QVector4D通过存储四个浮点数(x, y, z, w)来定义其在四维空间中的位置和方向。
官方文档:https://doc.qt.io/qt-5/qvector4d.html

二、使用范围

QVector4D类的使用范围包括但不限于:

  • 3D图形渲染:在3D图形编程中,QVector4D常用于表示顶点坐标、颜色值(包括透明度)、纹理坐标等。
  • 物理模拟:在物理引擎中,QVector4D可用于表示力和速度等物理量的四维向量。
  • 动画:在动画系统中,QVector4D可用于表示关键帧的插值数据。
  • 数学计算:QVector4D提供了丰富的数学函数,如点积、叉积、归一化等,方便进行四维向量的各种计算。

三、类的头文件

在Qt 5.15版本中,QVector4D类的头文件是<QVector4D>,它位于QtCore模块中。因此,在使用QVector4D类之前,需要在项目的.pro文件中添加QT += core配置,以包含QtCore模块。

四、类的继承

QVector4D类是一个独立的类,不继承自其他类。它实现了对四维向量的表示和操作功能,是Qt几何数据类体系中的一个重要组成部分。

五、类的构造介绍

QVector4D类提供了多个构造函数,允许以不同的方式初始化四维向量:

  1. QVector4D():构造一个默认的QVector4D对象,其x、y、z、w分量均被设置为0.0。
  2. QVector4D(float xpos, float ypos, float zpos, float wpos):构造一个具有指定x、y、z、w分量的QVector4D对象。
  3. QVector4D(const QPoint &point):根据二维点构造QVector4D对象,其z和w分量被设置为0.0。
  4. QVector4D(const QPointF &point):与上一个构造函数类似,但使用QPointF对象作为输入。
  5. QVector4D(const QVector2D &vector):根据二维向量构造QVector4D对象,其z和w分量被设置为0.0。
  6. QVector4D(const QVector2D &vector, float zpos, float wpos):根据二维向量和指定的z、w分量构造QVector4D对象。
  7. QVector4D(const QVector3D &vector):根据三维向量构造QVector4D对象,其w分量被设置为0.0。
  8. QVector4D(const QVector3D &vector, float wpos):根据三维向量和指定的w分量构造QVector4D对象。

六、共有函数介绍

QVector4D类提供了以下共有成员函数,用于操作和查询四维向量的属性:

  • float x() const:返回x分量。
  • float y() const:返回y分量。
  • float z() const:返回z分量。
  • float w() const:返回w分量。
  • void setX(float x):设置x分量。
  • void setY(float y):设置y分量。
  • void setZ(float z):设置z分量。
  • void setW(float w):设置w分量。
  • bool isNull() const:如果x、y、z、w分量都等于0.0(考虑到浮点数精度),则返回true。
  • float length() const:返回向量的长度(模)。
  • float lengthSquared() const:返回向量长度的平方,避免了开方运算,通常用于比较长度时提高效率。
  • QVector4D normalized() const:返回向量的归一化形式(单位向量),不改变原向量。
  • void normalize():就地(in-place)归一化向量,如果向量是零向量或长度非常接近1,则不进行任何操作。
  • QVector4D &operator*=(float factor):将向量乘以一个标量因子。
  • QVector4D &operator*=(const QVector4D &vector):将向量与另一个向量进行分量乘法运算。
  • QVector4D &operator+=(const QVector4D &vector):将向量与另一个向量进行分量加法运算。
  • QVector4D &operator-=(const QVector4D &vector):将向量与另一个向量进行分量减法运算。
  • QVector4D &operator/=(float divisor):将向量除以一个标量因子。
  • QVector4D &operator/=(const QVector4D &vector):将向量与另一个向量进行分量除法运算(对应分量相除)。

七、static函数介绍

在Qt 5.15版本中,QVector4D类提供了一个static成员函数:

  • static float dotProduct(const QVector4D &v1, const QVector4D &v2):计算两个向量的点积。

八、运算符重载

QVector4D类支持以下运算符重载,使得向量的操作更加直观和方便:

  • QVector4D operator+(const QVector4D &vector):向量加法。
  • QVector4D operator-(const QVector4D &vector):向量减法。
  • QVector4D operator*(float factor):向量与标量乘法。
  • QVector4D operator*(const QVector4D &vector):向量与向量分量乘法(不同于operator*=(const QVector4D &vector),后者会修改原向量)。
  • QVector4D operator/(float divisor):向量与标量除法。
  • QVector4D operator/(const QVector4D &divisor):向量与向量分量除法(对应分量相除)。
  • bool operator==(const QVector4D &vector):向量相等比较。
  • bool operator!=(const QVector4D &vector):向量不等比较。

此外,QVector4D类还支持类型转换运算符operator QVariant() const,允许将QVector4D对象转换为QVariant对象。

九、详细代码举例

以下是一个使用QVector4D类的详细代码示例:

#include <QCoreApplication>
#include <QVector4D>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 构造QVector4D对象
    QVector4D vector1(1.0f, 2.0f, 3.0f, 4.0f);
    QVector4D vector2(5.0f, 6.0f, 7.0f, 8.0f);

    // 输出向量的分量
    qDebug() << "Vector1:" << "x=" << vector1.x() << ", y=" << vector1.y() << ", z=" << vector1.z() << ", w=" << vector1.w();
    qDebug() << "Vector2:" << "x=" << vector2.x() << ", y=" << vector2.y() << ", z=" << vector2.z() << ", w=" << vector2.w();

    // 向量加法
    QVector4D sum = vector1 + vector2;
    qDebug() << "Sum:" << "x=" << sum.x() << ", y=" << sum.y() << ", z=" << sum.z() << ", w=" << sum.w();

    // 向量减法
    QVector4D difference = vector1 - vector2;
    qDebug() << "Difference:" << "x=" << difference.x() << ", y=" << difference.y() << ", z=" << difference.z() << ", w=" << difference.w();

    // 向量与标量乘法
    QVector4D scaledVector = vector1 * 2.0f;
    qDebug() << "Scaled Vector1:" << "x=" << scaledVector.x() << ", y=" << scaledVector.y() << ", z=" << scaledVector.z() << ", w=" << scaledVector.w();

    // 向量点积
    float dotProd = QVector4D::dotProduct(vector1, vector2);
    qDebug() << "Dot Product:" << dotProd;

    // 向量归一化
    QVector4D normalizedVector = vector1.normalized();
    qDebug() << "Normalized Vector1:" << "x=" << normalizedVector.x() << ", y=" << normalizedVector.y() << ", z=" << normalizedVector.z() << ", w=" << normalizedVector.w();

    // 向量长度
    float length = vector1.length();
    qDebug() << "Length of Vector1:" << length;

    return a.exec();
}

在这个示例中,我们创建了两个QVector4D对象vector1vector2,并使用了加法、减法、与标量乘法、点积、归一化和长度计算等成员函数来操作它们。此外,我们还展示了如何使用qDebug()函数输出向

何曾参静谧的博客


在这里插入图片描述

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

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

相关文章

docker desktop运行rabittmq容器,控制台无法访问

docker desktop运行rabittmq容器&#xff0c;控制台无法访问 启动过程&#xff1a;…此处缺略&#xff0c;网上一大堆 原因 原因是在Docker上运行的RabbitMQ&#xff0c;默认情况下是没有启用管理插件和管理页面的 解决办法 使用命令 docker exec -it 容器id /bin/bash 进…

MySQL-事务(详细版)

目录 事务的含义 举一个例子 事务的特征&#xff08;面试高频&#xff09; 原子性 一致性 隔离性 持久性 事务结束 查看事务提交方式 查看事务提交的变量值&#xff1a;on 自动提交 off 不是自动提交 实例 事务回滚 验证事务回滚 事务实现&#xff1a;是数据库提…

Python “文件和IO操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中“文件和IO操作”的一些题目&#xff0c;方便学习完Python的函数之后进行一些知识检验&#xff0c;感兴趣的小伙伴可以试一试&#xff0c;含选择题、判断题、填空题。 在做题之前可以先学习或者温习一下Python的异常处理机制&#xff0c;推荐阅读下面这篇…

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络&#xff1a;docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器&#xff08;跳过宿主机&#xff09;内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络&#xff1a;docker0…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

计算机图形学论文 | 木工设计与制造计划的共同优化

&#x1f98c;&#x1f98c;&#x1f98c;读论文 我们的系统共同探索离散设计变量和制造计划的空间&#xff0c;以生成&#xff08;设计&#xff0c;制造计划&#xff09;对的帕累托前沿&#xff0c;使制造成本最小化。在该图中&#xff0c;(a)是椅子的输入设计和仅探索该设计的…

【百日算法计划】:每日一题,见证成长(023)

题目 每日温度 请根据每日气温列表,重新生成一个列表,对应的位置的输出为:要想观测到更高的气温,至少需要等待的天数.如果气温在这之后都不再升高,则该位置用0代替. 例如,给定一个列表[73, 74, 65, 80,] 你的输出应该是[1, 2, 1, 0] 思路 首先&#xff0c;我们先来画图分析一…

【在Linux世界中追寻伟大的One Piece】多路转接epoll

目录 1 -> I/O多路转接之poll 1.1 -> poll函数接口 1.2 -> poll的优点 1.3 -> poll的缺点 1.4 -> poll示例 1.4.1 -> 使用poll监控标准输入 2 -> I/O多路转接之epoll 2.1 -> 初识epoll 2.2 -> epoll的相关系统调用 2.2.1 -> epoll_cre…

推动AI云产业向深向实,云·AI·算力创新发展大会即将启幕

近年来&#xff0c;以AIGC为代表的新兴技术正加速演进&#xff0c;全球站在智能化变革的起点&#xff0c;人工智能与云计算的深度融合&#xff0c;也驱动云计算进入第三次发展浪潮&#xff0c;迎来前所未有的机遇。 伴随AI的快速发展&#xff0c;2024年《政府工作报告》明确提…

5G 现网信令参数学习(3) - RrcSetup(1)

目录 1. rlc-BearerToAddModList 1.1 rlc-Config 1.1.1 ul-AM-RLC 1.1.2 dl-AM-RLC 1.2 mac-LogicalChannelConfig 2. mac-CellGroupConfig 2.1 schedulingRequestConfig 2.2 bsr-Config 2.3 tag-Config 2.4 phr-Config 2.5 skipUplinkTxDynamic 3. physicalCellG…

【MyBatis源码】深入分析TypeHandler原理和源码

文章目录 原始 JDBC 存在的问题自定义 TypeHandler 实现TypeHandler详解BaseTypeHandler类TypeReference类型参考器43个类型处理器类型注册表&#xff1a;3个注解类枚举类 原始 JDBC 存在的问题 MyBatis 之所以设计了 TypeHandler&#xff08;类型处理器&#xff09;&#xff…

运营篇|公众号小程序如何实现流量主变现

公众号小程序如何实现流量主变现&#xff1f;三步走&#xff1a; ①开通流量主&#xff1b; ②接入广告&#xff1b; ③裂变传播&#xff1b; 一、小程序开通流量主的运营要求 微信小程序开通流量主的前提条件主要包括以下几个方面&#xff1a; 日活跃用户&#xff08;DAU…

丹摩征文活动 | 轻松上手图像生成:FLUX.1遇上ComfyUI,让复杂变简单!

一、背景 FLUX.1是由黑森林实验室推出的一款前沿图像生成模型&#xff0c;针对不同用户需求&#xff0c;提供了三种不同版本。 FLUX.1-pro是专为企业设计的闭源版本&#xff0c;拥有无与伦比的性能和生成能力。其在识别提示词、提升视觉质量、细节表现及输出多样性方面都有出…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(三)

文章目录 Contiguous vs Non-Contiguous TensorTensor and ViewStrides非连续数据结构&#xff1a;Transpose( )在 PyTorch 中检查Contiguous and Non-Contiguous将不连续张量&#xff08;或视图&#xff09;转换为连续张量view() 和 reshape() 之间的区别总结 参考文献 Contig…

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「IDE」集成开发环境&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

Kafka经典面试题

1、kafka消息发送的流程&#xff1f; producer发送过程中启动两个线程 一个main线程 一个sender线程&#xff0c;在main线程中先创建一个双端队列&#xff08;RecordAccumlator、producerbatch&#xff09;&#xff0c;main将我们需要发送的东西经过拦截器&#xff0c;序列化&a…

手把手写深度学习(29):将DDP训练代码改成DeepSpeed

手把手写深度学习(0)&#xff1a;专栏文章导航 前言&#xff1a;deepspeed已经成为了大模型时代训练模型的常规武器&#xff0c;这篇博客以一个基于DDP的 Stable Diffusion模型训练为例&#xff0c;讲解如何从将DDP训练代码改成DeepSpeed。 目录 构建optimizer 构建scheduler…

信息收集系列(二):ASN分析及域名收集

内容预览 ≧∀≦ゞ 信息收集系列&#xff08;二&#xff09;&#xff1a;ASN分析及域名收集前言一、ASN 分析1. 获取 ASN 码2. 使用 ASNMap 获取 IP 范围3. 将 IP 范围转化为 IP 列表 二、关联域名收集1. 顶级域&#xff08;TLD&#xff09;收集测试方法 2. 根域名收集常用方法…

《数学分析》中不等式及补充

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮到大家那就更加有意义了。 注&#xff1a;1&#xff09;《数学分析》中的不等式及不等式的补充

HTML之图片和超链接的学习记录

图片 在HTML中&#xff0c;我们可以使用img标签来显示一张图片。对于img标签&#xff0c;我们只需要掌握它的三个属性&#xff1a;src、alt和title。 <img src"" alt"" title"" /> src用于指定图片所在的路径&#xff0c;这个路径可以是…