Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.11 KB | None | 0 0
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QPainter>
  4. #include <cmath>
  5. #include <QtMath>
  6. #include <iostream>
  7. #include <QTimer>
  8. #include <QPainterPath>
  9. #include <QMessageBox>
  10.  
  11. using namespace std;
  12.  
  13. MainWindow::MainWindow(QWidget *parent) :
  14. QMainWindow(parent),
  15. ui(new Ui::MainWindow)
  16. {
  17. ui->setupUi(this);
  18. is_paint_allowed = false;
  19. is_draw_button_clicked = false;
  20. itvalue = 10;
  21. ui->warlabel1->setVisible(0);
  22. ui->warlabel2->setVisible(0);
  23. is_drawbyone = 0;
  24. ui->warlabel1->setStyleSheet("QLabel { color : red; }");
  25. ui->warlabel2->setStyleSheet("QLabel { color : red; }");
  26. ui->textEdit->setReadOnly(true);
  27. ui->lineEdit->setReadOnly(true);
  28. }
  29.  
  30. MainWindow::~MainWindow()
  31. {
  32. delete ui;
  33. }
  34.  
  35. int getPt( int n1 , int n2 , float perc )
  36. {
  37. int diff = n2 - n1;
  38.  
  39. return n1 + ( diff * perc );
  40. }
  41.  
  42. static QPoint getPxl(QVector<int> vecx, QVector<int> vecy, double i)
  43. {
  44. QVector<int> resx, resy;
  45. for (int j = 0; j < vecx.size() - 1; ++j)
  46. {
  47. resx.push_back(getPt(vecx[j], vecx[j + 1], i)) ;
  48. resy.push_back(getPt(vecy[j], vecy[j + 1], i)) ;
  49. }
  50.  
  51. return resx.size() == 1 ? QPoint(resx[0], resy[0]) : getPxl(resx, resy, i);
  52. }
  53. void MainWindow::paintEvent(QPaintEvent *)
  54. {
  55. if (!is_paint_allowed )
  56. return;
  57.  
  58. QPainter painter(this);
  59. painter.setRenderHint(QPainter::Antialiasing);
  60. painter.setPen(Qt::black);
  61. int x = ui->xspin->value();
  62. int y = ui->yspin->value();
  63. /*int len1 = x < 600 - x ? x : 600 - x;
  64. int len2 = y < 600 - y ? y : 600 - y;
  65. int len = len1 > len2 ? len2 : len1;*/
  66.  
  67. //ui->iter_label->setText("Iteration number: " + QString::number(value));
  68.  
  69. for(double i = 0; is_drawbyone ? i < curri : i < 1 ; i += 0.01 )
  70. {
  71. QPoint pxl = getPxl(vecx, vecy, i);
  72.  
  73. if (prevp.x() != 0 && prevp.y() != 0)
  74. painter.drawLine(prevp.x(), prevp.y(), pxl.x(), pxl.y());
  75. painter.drawPoint(pxl);
  76. prevp = pxl;
  77. }
  78. prevp.setX(0);
  79. prevp.setY(0);
  80.  
  81. is_paint_allowed = false;
  82. is_draw_button_clicked = false;
  83. if (is_drawbyone && curri < 1)
  84. {
  85. QTimer::singleShot(250, this, SLOT(on_drawbyone()));
  86. is_drawbyone = 0;
  87. }
  88. else
  89. curri = 0;
  90. }
  91.  
  92. void MainWindow::on_drawButton_clicked()
  93. {
  94. is_paint_allowed = true;
  95. is_draw_button_clicked = true;
  96. MainWindow::update();
  97. }
  98.  
  99. void MainWindow::on_drawbyone_clicked()
  100. {
  101. is_paint_allowed = true;
  102. is_draw_button_clicked = false;
  103. curri = 0;
  104. is_drawbyone = 1;
  105. MainWindow::update();
  106. }
  107.  
  108. void MainWindow::on_drawbyone()
  109. {
  110. is_paint_allowed = true;
  111. is_draw_button_clicked = false;
  112. curri += 0.01;
  113. is_drawbyone = 1;
  114. MainWindow::update();
  115. }
  116.  
  117. void MainWindow::on_xspin_valueChanged(double arg1)
  118. {
  119. if (arg1 < 50 || arg1 > 400)
  120. {
  121. ui->warlabel1->setVisible(1);
  122. ui->drawButton->setEnabled(0);
  123. ui->drawbyone->setEnabled(0);
  124. ui->enterButton->setEnabled(false);
  125. }
  126. else
  127. {
  128. ui->warlabel1->setVisible(0);
  129. ui->drawButton->setEnabled(1);
  130. ui->drawbyone->setEnabled(1);
  131. ui->enterButton->setEnabled(true);
  132. }
  133. }
  134.  
  135. void MainWindow::on_yspin_valueChanged(double arg1)
  136. {
  137. if (arg1 < 50 || arg1 > 600)
  138. {
  139. ui->warlabel2->setVisible(1);
  140. ui->drawButton->setEnabled(0);
  141. ui->drawbyone->setEnabled(0);
  142. ui->enterButton->setEnabled(false);
  143. }
  144. else
  145. {
  146. ui->warlabel2->setVisible(0);
  147. ui->drawButton->setEnabled(1);
  148. ui->drawbyone->setEnabled(1);
  149. ui->enterButton->setEnabled(true);
  150. }
  151. }
  152.  
  153. void MainWindow::on_enterButton_clicked()
  154. {
  155. vecx.push_back(ui->xspin->value());
  156. vecy.push_back(ui->yspin->value());
  157.  
  158. ui->textEdit->setText(ui->textEdit->toPlainText() +
  159. QString::number(ui->xspin->value()) + " " + QString::number(ui->yspin->value()) + "\n");
  160. }
  161.  
  162. void MainWindow::on_clearButton_clicked()
  163. {
  164. vecx.clear();
  165. vecy.clear();
  166. prevp.setX(0);
  167. prevp.setY(0);
  168. ui->textEdit->setText("");
  169. curri = 0;
  170. }
  171.  
  172. long factorial(int n)
  173. {
  174. int c;
  175. long result = 1;
  176.  
  177. for (c = 1; c <= n; c++)
  178. result = result * c;
  179.  
  180. return result;
  181. }
  182.  
  183. #define A "(1-t)"
  184. #define B "t"
  185.  
  186. void MainWindow::on_showButton_clicked()
  187. {
  188. QVector<int> cof;
  189. int n = vecx.size() - 1;
  190. QString res1;
  191.  
  192. for (int i = 0 ; i <= n; i++)
  193. cof.push_back(factorial(n) / (factorial(i) * factorial(n - i)));
  194.  
  195. res1 = A + QString::number(n) + " + ";
  196.  
  197. for (int i = 1; i < n; ++i)
  198. {
  199. res1 += QString::number(cof[i]) + B + QString::number(i) + " " + A + QString::number(n - i) + " + ";
  200. }
  201.  
  202. res1 += B + QString::number(n);
  203.  
  204. ui->lineEdit->setText(res1);
  205. }
  206.  
  207. void MainWindow::on_actionHelp_triggered()
  208. {
  209. QMessageBox::information(this, "Help", tr("На початку ХХ ст.Сергій Натанович Бернштейн, що закінчив Харківський університет"
  210. ", під час доведення теореми Стоуна-Вейєрштрасса вперше вивів поліноми, що будуються"
  211. "в явному вигляді, які і стали основою для отримання сплайнів, в тому числі і "
  212. "кривих Безьє. Крива Безьє – основа векторної графіки. Застосування кривої Безьє є"
  213. "досить широким: спосіб управління рухом, засіб створення анімаційних рисунків, "
  214. "метод опису художніх шрифтів, спосіб передачі виділених об’єктів, інтерактивний "
  215. "інструмент дизайну форми різноманітних об’єктів. Безьє розробив метод зображення "
  216. "кривої, який створює у користувача більш природне сприйняття. Крива Безьє в"
  217. "изначається вершинами багатокутника, який задає форму кривої."
  218. "Кривій належить перша та остання вершина, в той час як інші вершини х"
  219. "арактеризують похідні, порядок та вид кривої. Таким чином, крива задається "
  220. "за допомогою відкритого багатокутника (ламаної) сформованого заданими точками."));
  221.  
  222.  
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement