How to develop Damped Harmonic Oscillator Simulation using QT C++
In This Video Tutorial we will show you how to Develop a Damped Harmonic Video simulation program in QT C++..

What is Damped Harmonic Oscillator

Damped harmonic oscillator is an Oscillator system where the amplitude of the oscillation decreases as time pass by. Most of the oscillatory system which we see in real life say simple pendulum,  LCR Circuit , flywheel rotation swing, all have this property. The cause of damping might be several aspects depending upon the physical system under investigation which includes air resistance, inductive or capacitive forces , friction etc.
 
Watch the video from the link below..




Main Source Code

Multithread.h

#ifndef MULTITHREAD_H
#define MULTITHREAD_H

#include <QMainWindow>
 #include <QThread>
#include <QObject>
#include <QMutex>
#include <QWaitCondition>
//#include<mainwindow.h>

class MultiThread : public QObject
{
    Q_OBJECT
public:

     MultiThread(QObject *parent = 0);
     void requestThread();
       void abort();
    void resume();


private:

    bool _abort;
    bool _working;
    QMutex mutex;
    QWaitCondition pauseContd;
     //MainWindow *mainwindow;


signals:
    void setChange();
    void multithreadRequested();

    void valueChanged(const QString &value);

    void finished();
    void resumed();

public slots:

    void doMultiThraed();

};
#endif // MULTITHREAD_H

Multithread.cpp

#include "Multithread.h"
#include <QTimer>
#include <QEventLoop>
#include "mainwindow.h"
#include <QThread>
#include <QDebug>

MultiThread::MultiThread(QObject *parent) :
    QObject(parent)
{
    _working =false;
    _abort = false;

}

void MultiThread::requestThread()
{
    mutex.lock();
    _working = true;
    _abort = false;
    qDebug()<<thread()->currentThreadId();
    mutex.unlock();

    emit multithreadRequested();
}

void MultiThread::abort()
{
    mutex.lock();
    if (_working) {
        _abort = true;
        qDebug()<<thread()->currentThreadId();
    }
    mutex.unlock();
}
void MultiThread::resume()
{
mutex.lock();
if(!_working)
{
_abort = true;
qDebug()<<thread()->currentThreadId();
}
mutex.unlock();
pauseContd.wakeAll();
emit resume();


}

void MultiThread::doMultiThraed()
{

    qDebug()<<thread()->currentThreadId();
    long int iCounter=0;
    int jCounter=0;
    while(true)
    {
     iCounter++;
     jCounter++;
 emit setChange();
     //mycode
     if(iCounter==9)
         iCounter=0;
        mutex.lock();
        bool abort = _abort;
        mutex.unlock();

        if (abort) {
            qDebug()<<thread()->currentThreadId();
            break;
        }

        QEventLoop loop;
        QTimer::singleShot(500, &loop, SLOT(quit()));
        loop.exec();
        emit valueChanged(QString::number(iCounter));

    }
    mutex.lock();
    _working = false;
    mutex.unlock();

    qDebug()<<thread()->currentThreadId();

    emit finished();

}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "Multithread.h"
#include <QThread>
namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
        int m_width;
        int m_Height;
        int m_NoOfRows;
        int m_NoOfCols;
        int m_XOffset; //Offset from which drawing start
        int m_YOffset;
        int m_ZOffset;
        qreal x;
        qreal y;
        qreal amplitude;
        qreal Time;
        qreal timePeriod;
        qreal x1;
        qreal y1;
        int jcounter;
        int flagncount;

    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void changeEvent(QEvent *e);
    void paintEvent(QPaintEvent *);
       void Initialize();

private:
    Ui::MainWindow *ui;
    QThread *thread;
        MultiThread *multithread;

private slots:
        void on_actionPAUSE_activated();
        void on_actionSTART_activated();
        void setValue();
    void on_pushButton_2_clicked();
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QtGui>
#include <QPointF>
#include <QPalette>
#include<math.h>

int YAXIS_Y1 = 150;
int YAXIS_Y2 = 700;
int YAXIS_X1 = 50;
int YAXIS_X2 = 50;
//XAXIS
int XAXIS_Y1 = 425;
int XAXIS_Y2 = 425;
int XAXIS_X1 = 50;
int XAXIS_X2 = 750;

int XAXISX1=0;
int XAXISY1=0;
int WIDTH=0;
int HEIGHT=0;
int STARTANGLE=0;
int SPANANGLE=0;
int flag=0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Initialize();
    thread=new QThread;
        multithread=new MultiThread;
        //mainwindow=new MainWindow;

        multithread->moveToThread(thread);

        connect(multithread, SIGNAL(valueChanged(QString)), ui->label, SLOT(setText(QString)));
        connect(multithread, SIGNAL(multithreadRequested()), thread, SLOT(start()));
       // connect(multithread, SIGNAL(multithreadRequested()), thread, SLOT(changeTwentyfive()));
        connect(thread, SIGNAL(started()), multithread, SLOT(doMultiThraed()));
        connect(multithread,SIGNAL(setChange()),SLOT(setValue()));

        connect(multithread, SIGNAL(finished()), thread, SLOT(quit()), Qt::DirectConnection);
}

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

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow ::Initialize()
{
         x=50.0;
         y=425.0;
         amplitude=0.0;
         Time=0.0;
         timePeriod=0;
          x1=x;
          y1=y;
          jcounter=0;
          flagncount=0;
          ui->textEdit_amplitude->setText("60");
}

void MainWindow::paintEvent(QPaintEvent *pEvent)
{

    QWidget::paintEvent(pEvent);
        QPainter painter(this);

        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(Qt::red);

        painter.drawText(35,185,"A");
        painter.drawText(35,200,"/");
        painter.drawText(36,203,"|");
        painter.drawText(37,203,"|");
        painter.drawText(38,200," ");
        painter.drawText(35,220,"Y");
        painter.drawText(35,427,"O");

        painter.drawText(650,448,"-> TIME - X axis");


        painter.drawLine(YAXIS_X1,YAXIS_Y1,YAXIS_X2,YAXIS_Y2);
        painter.drawLine(XAXIS_X1,XAXIS_Y1,XAXIS_X2,XAXIS_Y2);


        //HERE WE PASTE OUR CODE
        QPainterPath path;
            path.moveTo(x,y);

            qreal t=0;

            for (int j=0;j<jcounter;j++)
            {
             t=amplitude;
                for(int a=1;a<amplitude;a++)
                 {
                  x1+=timePeriod/t;
                  t--;
                  y1-=1;
                  path.lineTo(x1,y1);
                  path.moveTo(x1,y1);
                 }


                t=1;
                 for(int b=amplitude;b>0;b--)
                 {

                    x1+=timePeriod/t;
                    t++;
                    y1+=1;
                    path.lineTo(x1,y1);
                    path.moveTo(x1,y1);
                 }
             //negative direction
                 t=amplitude;
                 for(int a=1;a<amplitude;a++)
                  {
                   x1+=timePeriod/t;
                   t--;
                   y1+=1;
                   path.lineTo(x1,y1);
                   path.moveTo(x1,y1);
                  }

                 t=1;

                  for(int b=amplitude;b>0;b--)
                  {
                       x1+=timePeriod/t;
                       t++;
                       y1-=1;
                       path.lineTo(x1,y1);
                       path.moveTo(x1,y1);
                  }


        //HERE WE APPLY OUR EQUATION FOR DAMPED HARMONIC SINEWAVE
        //nextamplitude=amplitude*e raised-(bt/2m)
        //m mass of body
        //t-time
        //b-damping constant
                    amplitude-=8;

        //          qreal amp=amplitude*qExp(1/(1*timePeriod)/2*10);
        //          amplitude=abs(amp);
                    flagncount++;


            }

        painter.drawPath(path);

        x=50.0;
        y=425.0;
        amplitude=0.0;
        Time=0.0;
        timePeriod=0;
        x1=x;
        y1=y;
        jcounter=0;
        flagncount=0;

}

void MainWindow :: setValue()
{
    QString var_Amplitude=ui->textEdit_amplitude->toPlainText();
        amplitude=var_Amplitude.toInt();

        //msgBox.setText(var_Amplitude);
        // msgBox.show();

        QString var_Timeperiod=ui->comboBox_timeprd->currentText();
        Time=var_Timeperiod.toInt();
        if(Time==10)
        {
            timePeriod=10/2;
        }else if(Time==20)
        {
            timePeriod=20/2;
        }else if(Time==30)
        {
            timePeriod=30/2;
        }

        QString s=ui->label->text();
        //msgBox.setText(s);
        //msgBox.show();
        int lbl=s.toInt();
    if(lbl==1)
        {

        jcounter=1;
         repaint();
    }else if(lbl==2)
    {


        jcounter=2;
         repaint();


    }else if(lbl==3)
    {

        jcounter=3;
         repaint();

    }else if(lbl==4)
    {


        jcounter=4;
         repaint();

    }else if(lbl==5)
    {


        jcounter=5;
         repaint();

    }else if(lbl==6)
    {

        jcounter=6;
         repaint();

    }else if(lbl==7)
    {


        jcounter=7;
         repaint();

    }else if(lbl==8)
    {
        jcounter=8;
         repaint();

    }else if(lbl==9)
    {
        jcounter=9;
         repaint();

    }


}


void MainWindow::on_pushButton_clicked()
{
        multithread->abort();
       thread->wait();
       multithread->requestThread();
}

void MainWindow::on_pushButton_2_clicked()
{
    multithread->abort();
        thread->wait();
}

void MainWindow::on_actionSTART_activated()
{
    //CODE FOR START
    multithread->abort();
    thread->wait();
    multithread->requestThread();
}

void MainWindow::on_actionPAUSE_activated()
{
    //CODE FOR PAUSING THE THREAD
         multithread->abort();
         thread->wait();
}

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}



See All Responses Below...
Author
Message Rating
Posted on:
Please Login to Post Your Comments
Name (Max. 100 characters)
Please post your comments here
Select Language
Comments
Attach File(Max. Size: 2 MB)
A few simple rules when posting your Comments,
  1. Please post only answers relevant to the topic of discussion.
  2. Please dont misuse this site or do not be abusive, offensive, inappropriate,harass anyone on the boards or post ads or spam. Doing so will delete your inappropriate messages and will block or delete your account on this site. 

 
TekTipsDownload
GateExam
Academic Projects
TekTipsExperts
Android