当前位置: 代码迷 >> QT开发 >> QT:让图形沿着样条曲线匀速走。附源码求解决QAQ,该怎么处理
  详细解决方案

QT:让图形沿着样条曲线匀速走。附源码求解决QAQ,该怎么处理

热度:106   发布时间:2016-04-25 03:11:25.0
QT:让图形沿着样条曲线匀速走。附源码求解决QAQ
在QT上能够根据鼠标点出的点算出cardinal样条曲线,然后让图形在上面走。

代码有点长,目前已经实现了根据鼠标所点出的点画出样条曲线。
但是不知道怎么让物件在图上匀速走。
如果做路径弧长参数化的话感觉略麻烦。
有一个同学把弧长分成非常多的小片段来移动近似于匀速了。

求详细解答感激不尽。。3天前才为了这个作业自学起QT的


#include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    resize(820,350);
    pix = QPixmap(720,350);

    btdraw = new QPushButton(this);
    btdraw ->setText("生成路径");
    btdraw->setGeometry(QRect(730,100,80,25));
    connect(btdraw,SIGNAL(clicked()),this,SLOT(test()));

    btMove = new QPushButton(this);
    btMove ->setText("小车运动");
    btMove->setGeometry(QRect(730,230,80,25));
    connect(btMove,SIGNAL(clicked()),this,SLOT(test2()));

    lineEdit = new QLineEdit(this);
    lineEdit->setGeometry(QRect(785,130,30,25));
    lineEdit->setText("20");

    lineEdit2 = new QLineEdit(this);
    lineEdit2->setGeometry(QRect(785,160,30,25));
    lineEdit2->setText("1");

    lineEdit3 = new QLineEdit(this);
    lineEdit3->setGeometry(QRect(785,265,30,25));
    lineEdit3->setText("10");

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter pp(&pix);
    pp.drawEllipse(Point,3,3);
    QBrush brush(Qt::blue);

    if(QAQ==1)
    {
        QPainterPath path;
        path.moveTo(x1[0],y1[0]);
        CPt *s;
        s=Spline;
        int draw;
        for(draw=0;draw<=g*(count-1);draw++)
        {
            path.lineTo(s->x,s->y);
            s++;
        }

        pp.drawPath(path);
        QAQ = 0;
    }

    if(TWT==1)
    {
        pp.setBrush(brush);
        CPt *s2;
        s2=Spline;
        int move;
        for(move=0;move<=(v*(count-1));move++)
        {
             pp.drawEllipse(s2->x,s2->y,20,20);
             s2++;

        }

    }


    QPainter painter(this);
    painter.drawPixmap(0,0,pix);
}


void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if((event->button()==Qt::LeftButton)&&QwQ==1)
    {
        Point = event->pos();
        x1[dot]=event->x();
        y1[dot]=event->y();
        dot++;
        count++;
        update();
    }

}

void MainWindow::test()
{
    QString str = lineEdit->text();
    g = str.toInt();
    QString str2 = lineEdit2->text();
    t = str2.toDouble();
    CSpline(x1,y1,g,t,count);  
    QAQ = 1;
    QwQ = 0;
    update();
}


void MainWindow::test2()
{
    QString str = lineEdit3->text();
    v = str.toInt();
    CSpline(x1,y1,v,t,count);
    TWT = 1;
    update();
}


void MainWindow::CSpline(double x[], double y[], int grain, double tension, int n)
{
    int i, np;
    n0 = n;
  相关解决方案