基于Qt的轨迹还原之三:代码实现与测试

先上代码,由于程序结构很清楚,上节也讲到了Qt中实现OpenGL的框架,因此代码读起来没有太大困难,如果有问题,欢迎私信~

MyGLWidget:

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include <QGLWidget>

class MyGLWidget : public QGLWidget
{
    Q_OBJECT
public:
    MyGLWidget(QWidget *parent = 0);
    ~MyGLWidget();
    void setData(QVector<double> , QVector<double>, QVector<double>);

protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);

    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);
    void wheelEvent(QWheelEvent *event);

public slots:
    void setXRotation(int angle);
    void setYRotation(int angle);
    void setZRotation(int angle);

    void setXtran(double x);
    void setYtran(double x);

    void setScale(double x);

signals:
    void xRotationChanged(int angle);
    void yRotationChanged(int angle);
    void zRotationChanged(int angle);

private:
    double xRot, yRot, zRot;
    double xtran, ytran;
    double scal;
    double dMax;
    QVector<double> dx, dy, dz, r, g, b;
    int dSize;
    QPoint lastPos;
};

#endif // MYGLWIDGET_H


#include <QtOpenGL>
#include "myglwidget.h"

MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(parent)
{
    dMax=0;
    xRot =0; yRot =0; zRot =0;
    xtran=0; ytran=0;
    scal=1;

    QVector<double> rl(7), gl(7), bl(7);
    rl[0]=1.0; rl[1]=1.0; rl[2]=1.0; rl[3]=0.0; rl[4]=0.0; rl[5]=0.0; rl[6]=1.0;
    gl[0]=0.0; gl[1]=0.5; gl[2]=1.0; gl[3]=1.0; gl[4]=0.0; gl[5]=1.0; gl[6]=0.0;
    bl[0]=0.0; bl[1]=0.0; bl[2]=0.0; bl[3]=0.0; bl[4]=1.0; bl[5]=1.0; bl[6]=1.0;
    r=rl; g=gl; b=bl;
}

MyGLWidget::~MyGLWidget(){}

void MyGLWidget::setData(QVector<double> x, QVector<double> y, QVector<double> z)
{
    dSize=x.size(); dx=x; dy=y; dz=z;
    for (int i=0;i<dSize;i++)
    {
        dMax=qMax(dMax,dx.at(i));
        dMax=qMax(dMax,dy.at(i));
        dMax=qMax(dMax,dz.at(i));
    }
}

void MyGLWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);
}

void MyGLWidget::resizeGL(int width, int height)
{
    int border=qMax(width,height);
    glViewport((width-border)/2, (height-border)/2, border, border);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-dMax*1.5, +dMax*1.5, -dMax*1.5, +dMax*1.5, -dMax*10.0, dMax*10.0);
    glMatrixMode(GL_MODELVIEW);
}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glScalef(scal,scal,scal);
    glTranslatef(xtran, ytran, 0);
    glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
    glRotatef(yRot / 16.0, 0.0, 1.0, 0.
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值