当前位置: 首页 > article >正文

QT中基于QMatrix4x4与QVector3D的三维坐标变换类实现

1.头文件

#ifndef COORDINATETRANSFORM3D_H
#define COORDINATETRANSFORM3D_H

#include <QVector3D>
#include <QMatrix4x4>

class CoordinateTransform3D {
public:
    CoordinateTransform3D();

    // 设置平移
    void translate(double dx, double dy, double dz);

    // 设置缩放
    void scale(double sx, double sy, double sz);

    // 设置旋转
    void rotateX(double angle); // 绕X轴旋转
    void rotateY(double angle); // 绕Y轴旋转
    void rotateZ(double angle); // 绕Z轴旋转

    // 应用变换到点
    QVector3D transform(const QVector3D &point) const;

private:
    QMatrix4x4 m_transform; // Qt的4x4矩阵类
};

#endif // COORDINATETRANSFORM3D_H

2.实现文件

#include "CoordinateTransform3D.h"

CoordinateTransform3D::CoordinateTransform3D() {
    // 初始化变换为单位矩阵
    m_transform.setToIdentity();
}

void CoordinateTransform3D::translate(double dx, double dy, double dz) {
    m_transform.translate(dx, dy, dz);
}

void CoordinateTransform3D::scale(double sx, double sy, double sz) {
    m_transform.scale(sx, sy, sz);
}

void CoordinateTransform3D::rotateX(double angle) {
    m_transform.rotate(angle, 1.0, 0.0, 0.0);
}

void CoordinateTransform3D::rotateY(double angle) {
    m_transform.rotate(angle, 0.0, 1.0, 0.0);
}

void CoordinateTransform3D::rotateZ(double angle) {
    m_transform.rotate(angle, 0.0, 0.0, 1.0);
}

QVector3D CoordinateTransform3D::transform(const QVector3D &point) const {
    QVector4D homogenousPoint(point.x(), point.y(), point.z(), 1.0);
    QVector4D transformedPoint = m_transform * homogenousPoint;
    return QVector3D(transformedPoint.x() / transformedPoint.w(),
                     transformedPoint.y() / transformedPoint.w(),
                     transformedPoint.z() / transformedPoint.w());
}

3. 测试文件

#include <QCoreApplication>
#include <QVector3D>
#include <QDebug>
#include "CoordinateTransform3D.h"

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    CoordinateTransform3D transform;

    // 设置变换
    transform.translate(10, 20, 30);
    transform.scale(2, 2, 2);
    transform.rotateX(45); // 绕X轴旋转45度
    transform.rotateY(30); // 绕Y轴旋转30度
    transform.rotateZ(60); // 绕Z轴旋转60度

    // 原始点
    QVector3D originalPoint(1, 1, 1);
    QVector3D transformedPoint = transform.transform(originalPoint);

    // 输出变换后的点
    qDebug() << "Original Point:" << originalPoint;
    qDebug() << "Transformed Point:" << transformedPoint;

    return a.exec();
}


http://www.kler.cn/a/324915.html

相关文章:

  • 外网访问 WebDav 服务
  • Python数据分析:分组转换transform方法
  • IDEA leetcode插件代码模板配置,登录闪退解决
  • PCHMI串口接收实验
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页
  • 大学语文教材电子版(第十一版)教学用书PDF及课件
  • 理想汽车使用无仪表盘设计的原因和弊端
  • 传统行业选择企业大文件传输系统需要注意哪些?
  • 【C语言刷力扣】2079.给植物浇水
  • 关于MATLAB计算3维图的向量夹角总是不正确的问题记录
  • 金融加密机的定义与功能
  • 【RabbitMQ——SpringBoot整合】
  • 少帅进行曲
  • 模拟实现(优先级队列)priority_queue:优先级队列、仿函数、 反向迭代器等的介绍
  • 再见 ESNI,你好 ECH!—— ECH的前世今生
  • 负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。
  • Elasticsearch实战应用:构建高效搜索引擎
  • vue 同一个页面第二次跳转路由内容不更新
  • SQL常用数据过滤 - EXISTS运算符
  • 基于SpringBoot校园失物招领系统设计与实现
  • 职业技能大赛-单元测试笔记分享
  • Git GUI操作流程
  • 使用Spring Cloud Config和JCE加密配置文件的实战教程
  • 新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)
  • 云端融合,远程监控:EasyCVR工地无线安防监控系统的云解决方案
  • 故障诊断 | 基于双路神经网络的滚动轴承故障诊断