「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类的强大功能和易用性。


相关推荐
Swift社区3 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht3 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht3 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20243 小时前
Swift 数组
开发语言
stm 学习ing4 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
前端Hardy5 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
湫ccc5 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe6 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin6 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python