「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) 通过二维点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类的强大功能和易用性。


相关推荐
Pniubi1 小时前
Java为什么要分堆和栈
java·开发语言
小小晓.1 小时前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
炸薯条!2 小时前
博客系统测试报告
开发语言·lua
Evand J2 小时前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
时间的拾荒人3 小时前
CMake 实战指南:从基础语法到静态库/动态库制作与链接
开发语言·c++·面试
xyouyuweizhu3 小时前
Java InetAddress 详解:从 IP 地址表示到主机名解析
java·开发语言·python
布莱克60512 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
LabVIEW开发12 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
Dream-Y.ocean13 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
benchmark_cc13 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash