欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 「QT」几何数据类 之 QVector3d 三维向量类

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

2024/11/14 2:20:52 来源:https://blog.csdn.net/qq_49443542/article/details/143624400  浏览:    关键词:「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类深度解析
      • 一、引言
      • 二、使用范围
      • 三、类的构造介绍
      • 四、共有函数介绍
      • 五、Static函数介绍
      • 六、运算符重载
      • 七、代码举例

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类的代码示例,展示了如何创建向量、进行向量运算以及使用静态成员函数:

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


在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com