Advertisement
osipyonok

4m lab3

Apr 15th, 2017
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.30 KB | None | 0 0
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <QPicture>
  7. #include <QImage>
  8. #include <QTimer>
  9. using namespace std;
  10.  
  11. const int PIX_SIZE = 10;
  12. const int MAXN = 111;
  13.  
  14. vector<vector<vector<double>>> res;
  15.  
  16. int cur = 0;
  17.  
  18. int nx, ny;
  19. double ai, bi, ci, fi;
  20. double a, lambda, ro, c;
  21. double hx, hy, tau, t_end, time;
  22. double t0, l, h, th, tc;
  23.  
  24. MainWindow::MainWindow(QWidget *parent) :
  25.     QMainWindow(parent),
  26.     ui(new Ui::MainWindow)
  27. {
  28.     ui->setupUi(this);
  29.  
  30.     vector<vector<double>> T(MAXN , vector<double>(MAXN));
  31.     vector<double> alfa(MAXN), beta(MAXN);
  32.  
  33.  
  34.     nx = ny = 30;
  35.     t_end = 60;
  36.     l = h = 2.5;
  37.     lambda = 2.3e-5;
  38.     ro = 7.85;
  39.     c = 0.00045;
  40.     th = 30;
  41.     tc = 80;
  42.     t0 = 5;
  43.  
  44.     hx = l / (nx - 1);
  45.     hy = h / (ny - 1);
  46.  
  47.     a = lambda / (ro * c);
  48.  
  49.     tau = t_end / 100.0;
  50.  
  51.     for (int i = 1; i <= nx; ++i)
  52.         for (int j = 1; j <= ny; ++j)
  53.             T[i][j] = t0;
  54.  
  55.     res.push_back(T);
  56.  
  57.     time = 0.0;
  58.  
  59.     while(time < t_end){
  60.         time += tau;
  61.  
  62.         for (int j = 1; j <= ny; ++j) {
  63.             alfa[1] = 0.0;
  64.             beta[1] = th;
  65.  
  66.             for (int i = 2; i <= nx - 1; ++i) {
  67.                 ai = lambda / (hx * hx);
  68.                 bi = 2.0 * lambda / (hx * hx) + ro * c / tau;
  69.                 ci = lambda / (hx * hx);
  70.                 fi = -ro * c * T[i][j] / tau;
  71.  
  72.                 alfa[i] = ai / (bi - ci * alfa[i - 1]);
  73.                 beta[i] = (ci * beta[i - 1] - fi) / (bi - ci * alfa[i - 1]);
  74.             }
  75.  
  76.             T[nx][j] = tc;
  77.  
  78.             for (int i = nx - 1; i >= 1; --i) {
  79.                 T[i][j] = alfa[i] * T[i + 1][j] + beta[i];
  80.             }
  81.  
  82.         }
  83.  
  84.         for (int i = 2; i <= nx - 1; ++i) {
  85.             alfa[1] = 2.0 * a * tau / (2.0 * a * tau + hy * hy);
  86.             beta[1] = hy * hy * T[i][1] / (2.0 * a * tau + hy * hy);
  87.  
  88.             for (int j = 2; j <= ny - 1; ++j) {
  89.                 ai = lambda / (hy * hy);
  90.                 bi = 2.0 * lambda / (hy * hy) + ro * c / tau;
  91.                 ci = lambda / (hy * hy);
  92.                 fi = -ro * c * T[i][j] / tau;
  93.  
  94.                 alfa[j] = ai / (bi - ci * alfa[j - 1]);
  95.                 beta[j] = (ci * beta[j - 1] - fi) / (bi - ci * alfa[j - 1]);
  96.             }
  97.  
  98.             T[i][ny] = (2.0 * a * tau * beta[ny - 1] + (hy * hy) * T[i][ny]) / (2.0 * a * tau * (1.0 - alfa[ny - 1]) + (hy * hy));
  99.  
  100.             for (int j = ny - 1; j >= 1; --j) {
  101.                 T[i][j] = alfa[j] * T[i][j + 1] + beta[j];
  102.             }
  103.         }
  104.         res.push_back(T);
  105.  
  106.     }
  107.     ui->tableWidget->setRowCount(10);
  108.     ui->tableWidget->setColumnCount(10);
  109.  
  110.     for(int i = 0 ; i < ui->tableWidget->rowCount() ; ++i)
  111.         ui->tableWidget->setRowHeight(i , 20);
  112.     for(int i = 0 ; i < ui->tableWidget->columnCount() ; ++i)
  113.         ui->tableWidget->setColumnWidth(i , 60);
  114.     ui->tableWidget->resize(QSize(60 * 10.5 - 5 , 20 * 11 + 5));
  115.     for(int i = 0 ; i < ui->tableWidget->rowCount() ; ++i)
  116.         for(int j = 0 ; j < ui->tableWidget->columnCount() ; ++j){
  117.             QTableWidgetItem * item = new QTableWidgetItem(QString::number(res[0][(i + 1) * nx / 10][(j + 1) * ny / 10]));
  118.             ui->tableWidget->setItem(i , j , item);
  119.         }
  120.  
  121. }
  122.  
  123. void MainWindow::update(){
  124.    if(cur > t_end){
  125.        trm->stop();
  126.        return;
  127.    }
  128.  
  129.    repaint();
  130.    QString str = "Time: "; str += QString::number(cur); str += " s.";
  131.    ui->label->setText(str);
  132.    ++cur;
  133.    cur = min(cur , (int)res.size() - 1);
  134. }
  135.  
  136.  
  137. void MainWindow::paintEvent(QPaintEvent *event){
  138.     Q_UNUSED(event);
  139.     QPainter painter(this);
  140.  
  141.     painter.setPen(QPen(Qt::black , 1 , Qt::SolidLine , Qt::FlatCap));
  142.     painter.setBrush(QBrush(Qt::red , Qt::SolidPattern));
  143.     QImage img(QSize(nx * PIX_SIZE , ny * PIX_SIZE) , QImage::Format_ARGB32);
  144.  
  145.     QImage grad("D:\\Qt_projects\\4m_lab3\\grad.jpg");
  146.  
  147.  
  148.     for(int i = 1 ; i <= nx ; ++i){
  149.         for(int j = 1 ; j <= ny ; ++j){
  150.             int el = res[cur][i][j];
  151.             QColor col;
  152.  
  153.             int mx = max(th , max(tc , t0));
  154.             int mn = min(th , min(tc , t0));
  155.  
  156.             int mc = mx - mn;
  157.  
  158.             int cl = el - mn;
  159.  
  160.             int ind = (double)cl / ((double)mc / 100.0);
  161.             if(ind <= 0)ind = 3;
  162.             if(ind >= 100)ind = 98;
  163.             ind = ((double)grad.width() / 100.0) * (double)ind;
  164.  
  165.             col = grad.pixelColor(ind , 20);
  166.  
  167.  
  168.             for(int x = PIX_SIZE * (i - 1) ; x < PIX_SIZE * i ; ++x){
  169.                 for(int y = PIX_SIZE * (j - 1) ; y < PIX_SIZE * j ; ++y){
  170.                     img.setPixelColor(x , y , col);
  171.                 }
  172.             }
  173.         }
  174.     }
  175.  
  176.     painter.drawImage(50,50,img);
  177.  
  178.     for(int i = 0 ; i < ui->tableWidget->rowCount() ; ++i)
  179.         for(int j = 0 ; j < ui->tableWidget->columnCount() ; ++j){
  180.             QTableWidgetItem * item = new QTableWidgetItem(QString::number(res[cur][(i + 1) * nx / 10.3][(j + 1) * ny / 10]));
  181.             ui->tableWidget->setItem(j , i , item);
  182.         }
  183. }
  184.  
  185. MainWindow::~MainWindow()
  186. {
  187.     delete ui;
  188.     if(trm != NULL){
  189.         delete trm;
  190.     }
  191. }
  192.  
  193.  
  194. void MainWindow::on_pushButton_2_clicked()
  195. {
  196.     cur = 0;
  197.     trm = new QTimer(this);
  198.     connect(trm , SIGNAL(timeout()) , this , SLOT(update()));
  199.     trm->start(250);
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement