Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QPainter>
- #include <cmath>
- #include <QtMath>
- #include <iostream>
- #include <QTimer>
- #include <QPainterPath>
- #include <QMessageBox>
- using namespace std;
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- is_paint_allowed = false;
- is_draw_button_clicked = false;
- itvalue = 10;
- ui->warlabel1->setVisible(0);
- ui->warlabel2->setVisible(0);
- is_drawbyone = 0;
- ui->warlabel1->setStyleSheet("QLabel { color : red; }");
- ui->warlabel2->setStyleSheet("QLabel { color : red; }");
- ui->textEdit->setReadOnly(true);
- ui->lineEdit->setReadOnly(true);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- int getPt( int n1 , int n2 , float perc )
- {
- int diff = n2 - n1;
- return n1 + ( diff * perc );
- }
- static QPoint getPxl(QVector<int> vecx, QVector<int> vecy, double i)
- {
- QVector<int> resx, resy;
- for (int j = 0; j < vecx.size() - 1; ++j)
- {
- resx.push_back(getPt(vecx[j], vecx[j + 1], i)) ;
- resy.push_back(getPt(vecy[j], vecy[j + 1], i)) ;
- }
- return resx.size() == 1 ? QPoint(resx[0], resy[0]) : getPxl(resx, resy, i);
- }
- void MainWindow::paintEvent(QPaintEvent *)
- {
- if (!is_paint_allowed )
- return;
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- painter.setPen(Qt::black);
- int x = ui->xspin->value();
- int y = ui->yspin->value();
- /*int len1 = x < 600 - x ? x : 600 - x;
- int len2 = y < 600 - y ? y : 600 - y;
- int len = len1 > len2 ? len2 : len1;*/
- //ui->iter_label->setText("Iteration number: " + QString::number(value));
- for(double i = 0; is_drawbyone ? i < curri : i < 1 ; i += 0.01 )
- {
- QPoint pxl = getPxl(vecx, vecy, i);
- if (prevp.x() != 0 && prevp.y() != 0)
- painter.drawLine(prevp.x(), prevp.y(), pxl.x(), pxl.y());
- painter.drawPoint(pxl);
- prevp = pxl;
- }
- prevp.setX(0);
- prevp.setY(0);
- is_paint_allowed = false;
- is_draw_button_clicked = false;
- if (is_drawbyone && curri < 1)
- {
- QTimer::singleShot(250, this, SLOT(on_drawbyone()));
- is_drawbyone = 0;
- }
- else
- curri = 0;
- }
- void MainWindow::on_drawButton_clicked()
- {
- is_paint_allowed = true;
- is_draw_button_clicked = true;
- MainWindow::update();
- }
- void MainWindow::on_drawbyone_clicked()
- {
- is_paint_allowed = true;
- is_draw_button_clicked = false;
- curri = 0;
- is_drawbyone = 1;
- MainWindow::update();
- }
- void MainWindow::on_drawbyone()
- {
- is_paint_allowed = true;
- is_draw_button_clicked = false;
- curri += 0.01;
- is_drawbyone = 1;
- MainWindow::update();
- }
- void MainWindow::on_xspin_valueChanged(double arg1)
- {
- if (arg1 < 50 || arg1 > 400)
- {
- ui->warlabel1->setVisible(1);
- ui->drawButton->setEnabled(0);
- ui->drawbyone->setEnabled(0);
- ui->enterButton->setEnabled(false);
- }
- else
- {
- ui->warlabel1->setVisible(0);
- ui->drawButton->setEnabled(1);
- ui->drawbyone->setEnabled(1);
- ui->enterButton->setEnabled(true);
- }
- }
- void MainWindow::on_yspin_valueChanged(double arg1)
- {
- if (arg1 < 50 || arg1 > 600)
- {
- ui->warlabel2->setVisible(1);
- ui->drawButton->setEnabled(0);
- ui->drawbyone->setEnabled(0);
- ui->enterButton->setEnabled(false);
- }
- else
- {
- ui->warlabel2->setVisible(0);
- ui->drawButton->setEnabled(1);
- ui->drawbyone->setEnabled(1);
- ui->enterButton->setEnabled(true);
- }
- }
- void MainWindow::on_enterButton_clicked()
- {
- vecx.push_back(ui->xspin->value());
- vecy.push_back(ui->yspin->value());
- ui->textEdit->setText(ui->textEdit->toPlainText() +
- QString::number(ui->xspin->value()) + " " + QString::number(ui->yspin->value()) + "\n");
- }
- void MainWindow::on_clearButton_clicked()
- {
- vecx.clear();
- vecy.clear();
- prevp.setX(0);
- prevp.setY(0);
- ui->textEdit->setText("");
- curri = 0;
- }
- long factorial(int n)
- {
- int c;
- long result = 1;
- for (c = 1; c <= n; c++)
- result = result * c;
- return result;
- }
- #define A "(1-t)"
- #define B "t"
- void MainWindow::on_showButton_clicked()
- {
- QVector<int> cof;
- int n = vecx.size() - 1;
- QString res1;
- for (int i = 0 ; i <= n; i++)
- cof.push_back(factorial(n) / (factorial(i) * factorial(n - i)));
- res1 = A + QString::number(n) + " + ";
- for (int i = 1; i < n; ++i)
- {
- res1 += QString::number(cof[i]) + B + QString::number(i) + " " + A + QString::number(n - i) + " + ";
- }
- res1 += B + QString::number(n);
- ui->lineEdit->setText(res1);
- }
- void MainWindow::on_actionHelp_triggered()
- {
- QMessageBox::information(this, "Help", tr("На початку ХХ ст.Сергій Натанович Бернштейн, що закінчив Харківський університет"
- ", під час доведення теореми Стоуна-Вейєрштрасса вперше вивів поліноми, що будуються"
- "в явному вигляді, які і стали основою для отримання сплайнів, в тому числі і "
- "кривих Безьє. Крива Безьє – основа векторної графіки. Застосування кривої Безьє є"
- "досить широким: спосіб управління рухом, засіб створення анімаційних рисунків, "
- "метод опису художніх шрифтів, спосіб передачі виділених об’єктів, інтерактивний "
- "інструмент дизайну форми різноманітних об’єктів. Безьє розробив метод зображення "
- "кривої, який створює у користувача більш природне сприйняття. Крива Безьє в"
- "изначається вершинами багатокутника, який задає форму кривої."
- "Кривій належить перша та остання вершина, в той час як інші вершини х"
- "арактеризують похідні, порядок та вид кривої. Таким чином, крива задається "
- "за допомогою відкритого багатокутника (ламаної) сформованого заданими точками."));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement