✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
「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版本)
一、类的引言
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类提供了多个构造函数,允许以不同的方式初始化四维向量:
QVector4D()
:构造一个默认的QVector4D对象,其x、y、z、w分量均被设置为0.0。QVector4D(float xpos, float ypos, float zpos, float wpos)
:构造一个具有指定x、y、z、w分量的QVector4D对象。QVector4D(const QPoint &point)
:根据二维点构造QVector4D对象,其z和w分量被设置为0.0。QVector4D(const QPointF &point)
:与上一个构造函数类似,但使用QPointF对象作为输入。QVector4D(const QVector2D &vector)
:根据二维向量构造QVector4D对象,其z和w分量被设置为0.0。QVector4D(const QVector2D &vector, float zpos, float wpos)
:根据二维向量和指定的z、w分量构造QVector4D对象。QVector4D(const QVector3D &vector)
:根据三维向量构造QVector4D对象,其w分量被设置为0.0。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类的详细代码示例:
cpp
#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对象vector1
和vector2
,并使用了加法、减法、与标量乘法、点积、归一化和长度计算等成员函数来操作它们。此外,我们还展示了如何使用qDebug()
函数输出向