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


相关推荐
阿七想学习几秒前
数据结构《链表》
java·开发语言·数据结构·学习·链表
极客代码3 分钟前
【Python TensorFlow】进阶指南(续篇二)
开发语言·人工智能·python·深度学习·tensorflow
计算机学姐16 分钟前
基于Python的高校成绩分析管理系统
开发语言·vue.js·后端·python·mysql·pycharm·django
VertexGeek18 分钟前
Rust学习(三):rust基础Ⅱ
开发语言·学习·rust
一个数据小开发23 分钟前
业务开发问题之ConcurrentHashMap
java·开发语言·高并发·map
三小尛1 小时前
插入排序(C语言)
c语言·开发语言
南宫理的日知录1 小时前
106、Python并发编程:深入浅出理解线程池的内部实现原理
开发语言·python·学习·编程学习
WolvenSec1 小时前
C/C++逆向:结构体逆向分析
c语言·开发语言·c++·网络安全
谢尔登1 小时前
前端开发调试之 PC 端调试
开发语言·前端
每天吃饭的羊1 小时前
在循环中只set一次
开发语言·前端·javascript