✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
「QT」QT5程序设计 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
「Math」探秘数学世界 |
目录
Qt中的QVector3D类深度解析
一、引言
在Qt框架中,QVector3D
类是一个用于表示三维空间中向量或点的关键类。它封装了三个浮点数坐标:x、y和z,使得对三维空间中的点或向量的操作变得更加直观和简便。本文将详细介绍QVector3D
类的构造方法、共有成员函数、静态成员函数、运算符重载,并通过代码示例来展示其使用方法。
官方帮助文档:https://doc.qt.io/qt-5/qvector3d.html
二、使用范围
QVector3D 类的使用范围广泛,包括但不限于:
3D图形渲染:用于表示3D空间中的点、方向向量和法向量。
游戏开发:用于处理角色位置、方向、速度等。
物理模拟:用于计算力、速度和加速度等物理量。
数据可视化:用于创建3D散点图、曲面图等。
三、类的构造介绍
QVector3D
类提供了多种构造方法来创建对象。以下是几种常见的构造方法:
- 默认构造方法 :
QVector3D()
创建一个零向量(0, 0, 0)。 - 指定坐标构造方法 :
QVector3D(float xpos, float ypos, float zpos)
通过指定x、y和z坐标来创建一个向量。 - 从二维向量构造 :
QVector3D(const QVector2D &v)
通过二维向量QVector2D
来创建一个三维向量,z坐标默认为0。 - 从二维点构造 :
QVector3D(const QPoint &point)
或QVector3D(const QPointF &point)
通过二维点QPoint
或QPointF
来创建一个三维向量,z坐标默认为0。
四、共有函数介绍
QVector3D
类提供了丰富的成员函数来操作和查询向量的属性:
- 坐标访问 :
float x() const
、float y() const
、float z() const
分别返回向量的x、y、z坐标。 - 坐标设置 :
void setX(float x)
、void setY(float y)
、void setZ(float z)
分别设置向量的x、y、z坐标。 - 向量运算 :包括加法(
operator+=
)、减法(operator-=
)、乘法(operator*=
,与标量相乘)、除法(operator/=
,与标量相除)。 - 长度计算 :
float length() const
返回向量的长度(模),float lengthSquared() const
返回向量长度的平方。 - 归一化 :
QVector3D normalized() const
返回当前向量的单位向量(归一化向量),void normalize()
将当前向量归一化为单位向量。 - 点乘和叉乘 :
float dotProduct(const QVector3D &v) const
计算当前向量与另一个向量的点乘,QVector3D crossProduct(const QVector3D &v) const
计算当前向量与另一个向量的叉乘。 - 投影 :
QVector3D project(const QVector3D &normal, const QVector3D &lightPos = QVector3D(0, 0, 1)) const
将当前向量投影到指定的法向量上。 - 检查零向量 :
bool isNull() const
检查当前向量是否为零向量。
五、Static函数介绍
QVector3D
类还提供了一些静态成员函数,这些函数不依赖于类的实例:
- 点乘 :
static float dotProduct(const QVector3D &v1, const QVector3D &v2)
计算两个向量的点乘。 - 叉乘 :
static QVector3D crossProduct(const QVector3D &v1, const QVector3D &v2)
计算两个向量的叉乘。 - 法向量 :
static QVector3D normal(const QVector3D &v1, const QVector3D &v2, const QVector3D &v3)
计算三个不共线点的法向量。
六、运算符重载
QVector3D
类重载了多种运算符,使得向量的运算更加直观:
- 加法 :
QVector3D operator+(const QVector3D &v) const
- 减法 :
QVector3D operator-(const QVector3D &v) const
- 乘法 :
QVector3D operator*(float factor) const
(与标量相乘) - 除法 :
QVector3D operator/(float divisor) const
(与标量相除) - 负向量 :
QVector3D operator-() const
- 相等 :
bool operator==(const QVector3D &v) const
- 不等 :
bool operator!=(const QVector3D &v) const
七、代码举例
以下是一个使用QVector3D
类的代码示例,展示了如何创建向量、进行向量运算以及使用静态成员函数:
cpp
#include <QVector3D>
#include <QDebug>
int main() {
// 创建两个三维向量
QVector3D v1(1.0f, 2.0f, 3.0f);
QVector3D v2(4.0f, 5.0f, 6.0f);
// 输出向量的坐标
qDebug() << "v1:" << v1.x() << "," << v1.y() << "," << v1.z();
qDebug() << "v2:" << v2.x() << "," << v2.y() << "," << v2.z();
// 向量加法
QVector3D v3 = v1 + v2;
qDebug() << "v1 + v2:" << v3.x() << "," << v3.y() << "," << v3.z();
// 向量减法
QVector3D v4 = v1 - v2;
qDebug() << "v1 - v2:" << v4.x() << "," << v4.y() << "," << v4.z();
// 向量与标量相乘
QVector3D v5 = v1 * 2.0f;
qDebug() << "v1 * 2.0f:" << v5.x() << "," << v5.y() << "," << v5.z();
// 向量与标量相除
QVector3D v6 = v1 / 2.0f;
qDebug() << "v1 / 2.0f:" << v6.x() << "," << v6.y() << "," << v6.z();
// 计算向量的长度
qDebug() << "Length of v1:" << v1.length();
// 计算向量的点乘和叉乘
float dotProd = QVector3D::dotProduct(v1, v2);
QVector3D crossProd = QVector3D::crossProduct(v1, v2);
qDebug() << "Dot product of v1 and v2:" << dotProd;
qDebug() << "Cross product of v1 and v2:" << crossProd.x() << "," << crossProd.y() << "," << crossProd.z();
// 归一化向量
QVector3D v1Normalized = v1.normalized();
qDebug() << "Normalized v1:" << v1Normalized.x() << "," << v1Normalized.y() << "," << v1Normalized.z();
// 检查向量是否为零向量
bool isNull = v1.isNull();
qDebug() << "Is v1 null?" << isNull;
return 0;
}
在这个示例中,我们创建了两个QVector3D
对象v1
和v2
,并进行了加法、减法、与标量的乘法和除法运算。我们还计算了向量的长度、点乘和叉乘,并对向量进行了归一化处理。最后,我们检查了向量v1
是否为零向量。通过这些操作,我们展示了QVector3D
类的强大功能和易用性。