「QT」几何数据类 之 QVector3d 三维向量类

✨博客主页
何曾参静谧的博客
「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) 通过二维点QPointQPointF来创建一个三维向量,z坐标默认为0。

四、共有函数介绍

QVector3D类提供了丰富的成员函数来操作和查询向量的属性:

  • 坐标访问float x() constfloat y() constfloat 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对象v1v2,并进行了加法、减法、与标量的乘法和除法运算。我们还计算了向量的长度、点乘和叉乘,并对向量进行了归一化处理。最后,我们检查了向量v1是否为零向量。通过这些操作,我们展示了QVector3D类的强大功能和易用性。


相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript