Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.48 KB | None | 0 0
  1. // Dolaczamy plik naglowkowy naszej klasy MyWindow
  2. #include "mywindow.h"
  3.  
  4. // Dolaczamy plik naglowkowy zawierajacy definicje GUI
  5. // Plik ten jest generowany automatycznie
  6. // z pliku XML "mywindow.ui"
  7. #include "ui_mywindow.h"
  8. #include <math.h>
  9. // Definicja konstruktora, wywolujemy najpierw
  10. // konstruktor klasy nadrzednej, nastepnie tworzymy
  11. // obiekt klasy Ui_MyWindow reprezentujacy GUI
  12. MyWindow::MyWindow(QWidget *parent) :
  13. QMainWindow(parent),
  14. ui(new Ui::MyWindow)
  15. {
  16. // Wywolujemy funkcje tworzaca elementy GUI
  17. // Jej definicja znajduje sie w pliku "ui_mywindow.h"
  18. ui->setupUi(this);
  19.  
  20. // Pobieramy wymiary i wspolrzedne lewego gornego naroznika ramki
  21. // i ustawiamy wartosci odpowiednich pol
  22. // Uwaga: ramke "rysujFrame" wykorzystujemy tylko do
  23. // wygodnego ustaiwenia tych wymiarow. Rysunek bedziemy wyswietlac
  24. // bezposrednio w glownym oknie aplikacji.
  25. szer = ui->rysujFrame->width();
  26. wys = ui->rysujFrame->height();
  27. poczX = ui->rysujFrame->x();
  28. poczY = ui->rysujFrame->y();
  29.  
  30. // Tworzymy obiekt klasy QImage, o odpowiedniej szerokosci
  31. // i wysokosci. Ustawiamy format bitmapy na 32 bitowe RGB
  32. // (0xffRRGGBB).
  33. img = new QImage(szer,wys,QImage::Format_RGB32);
  34. unsigned char *ptr;
  35. ptr = img->bits();
  36. int szer = img->width();
  37. int wys = img->height();
  38.  
  39. int i,j;
  40. for(i=0;i<wys;i++)
  41. {
  42. for(j=0;j<szer ;j++)
  43. {
  44. ptr[szer*4*i + 4*j]=0;
  45. ptr[szer*4*i + 4*j + 1] = 0;
  46. ptr[szer*4*i + 4*j + 2] = 0;
  47. }
  48. }
  49.  
  50. }
  51.  
  52. // Definicja destruktora
  53. MyWindow::~MyWindow()
  54. {
  55. delete ui;
  56. }
  57.  
  58. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Wyjscie" (exitButton)
  59. // Uwaga: polaczenie tej funkcji z sygnalem "clicked"
  60. // emitowanym przez przycisk jest realizowane
  61. // za pomoca funkcji QMetaObject::connectSlotsByName(MyWindow)
  62. // znajdujacej sie w automatycznie generowanym pliku "ui_mywindow.h"
  63. // Nie musimy wiec sami wywolywac funkcji "connect"
  64. void MyWindow::on_exitButton_clicked()
  65. {
  66. // qApp to globalny wskaznik do obiektu reprezentujacego aplikacje
  67. // quit() to funkcja (slot) powodujaca zakonczenie aplikacji z kodem 0 (brak bledu)
  68. qApp->quit();
  69. }
  70.  
  71.  
  72. // Funkcja "odmalowujaca" komponent
  73. void MyWindow::paintEvent(QPaintEvent*)
  74. {
  75. // Obiekt klasy QPainter pozwala nam rysowac na komponentach
  76. QPainter p(this);
  77.  
  78. // Rysuje obrazek "img" w punkcie (poczX,poczY)
  79. // (tu bedzie lewy gorny naroznik)
  80. p.drawImage(poczX,poczY,*img);
  81.  
  82. }
  83.  
  84.  
  85. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Czysc" (cleanButton)
  86. void MyWindow::on_cleanButton_clicked()
  87. {
  88. // Funkcja czysci (zamalowuje na bialo) obszar rysowania
  89. // definicja znajduje sie ponizej
  90. czysc();
  91.  
  92. // Funkcja "update()" powoduje ponowne "namalowanie" calego komponentu
  93. // Wywoluje funkcje "paintEvent"
  94. update();
  95. }
  96.  
  97.  
  98. // Funkcja (slot) wywolywana po nacisn ieciu przycisku "Rysuj 1" (draw1Button)
  99.  
  100.  
  101. void MyWindow::czysc()
  102. {
  103. // Wskaznik za pomoca, ktorego bedziemy modyfikowac obraz
  104. unsigned char *ptr;
  105.  
  106. // Funkcja "bits()" zwraca wskaznik do pierwszego piksela danych
  107. ptr = img->bits();
  108.  
  109. int i,j;
  110.  
  111. // Przechodzimy po wszystkich wierszach obrazu
  112. for(i=0; i<wys; i++)
  113. {
  114. // Przechodzimy po pikselach danego wiersza
  115. // W kazdym wierszu jest "szer" pikseli (tzn. 4 * "szer" bajtow)
  116. for(j=0; j<szer; j++)
  117. {
  118. ptr[szer*4*i + 4*j]=0; // Skladowa BLUE
  119. ptr[szer*4*i + 4*j + 1] = 0; // Skladowa GREEN
  120. ptr[szer*4*i + 4*j + 2] = 0; // Skladowa RED
  121. }
  122. }
  123. }
  124.  
  125.  
  126. // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
  127.  
  128. void MyWindow::rysuj(int x1, int y1){
  129. unsigned char *ptr;
  130. ptr = img->bits();
  131. if ((x1>0)&&(y1>0)&&(x1<szer )&&(y1<wys)){
  132. ptr[szer*4*(y1) + 4*(x1)] = 0;
  133. ptr[szer*4*(y1) + 4*(x1) + 1] = 0;
  134. ptr[szer*4*(y1) + 4*(x1) + 2] = 255;
  135. }
  136. }
  137. void MyWindow::rysujprosta(int x1, int x2 , int y1, int y2){
  138.  
  139. unsigned char *ptr;
  140. ptr = img->bits();
  141. if ((x1>=0)&&(y1>=0)&&(x1<szer)&&(y1<wys) && (x2>=0)&&(y2>=0)&&(x2<szer)&&(y2<wys)){
  142. // Sprawdzamy czy klikniecie nastapilo w granicach rysunku
  143.  
  144. if(abs(x2-x1) >= abs(y2-y1)){
  145. if(x1 > x2){
  146. std::swap(x1,x2);
  147. std::swap(y1,y2);
  148. }
  149. double a = (double)(y2 - y1)/(x2 - x1);
  150. double b = (double) y2 - a * x2;
  151. for(int i = x1 ; i <= x2 ; i++){
  152. int j = a * i + b;
  153. ptr[szer*4*j + 4*i] = 255;
  154. ptr[szer*4*j + 4*i + 1] = 255;
  155. ptr[szer*4*j + 4*i + 2] = 255;
  156. }
  157. }
  158. else{
  159. if(y1 > y2){
  160. std::swap(x1,x2);
  161. std::swap(y1,y2);
  162. }
  163. double a = (double)(x2 - x1)/(y2 - y1);
  164. double b = (double) x2 - a * y2;
  165. for(int i = y1 ; i <= y2 ; i++){
  166. int j = a * i + b;
  167. ptr[szer*4*i + 4*j] = 255;
  168. ptr[szer*4*i + 4*j + 1] = 255;
  169. ptr[szer*4*i+ 4*j + 2] = 255;
  170. }
  171. }
  172. }
  173.  
  174.  
  175.  
  176.  
  177.  
  178. }
  179. // Funkcja (slot) wywolywana po nacisnieciu przycisku myszy (w glownym oknie)
  180. void MyWindow::mousePressEvent(QMouseEvent *event)
  181. {
  182. x1 = event->x();
  183. y1 = event->y();
  184. x1 -= poczX;
  185. y1 -= poczY;
  186. update();
  187. }
  188.  
  189.  
  190. void MyWindow::mouseReleaseEvent(QMouseEvent *event)
  191. {
  192.  
  193.  
  194. int x2 = event->x();
  195. int y2 = event->y();
  196.  
  197.  
  198.  
  199. x2 -= poczX;
  200. y2 -= poczY;
  201.  
  202.  
  203. double n = 5 ;
  204. unsigned char *ptr;
  205. ptr = img->bits();
  206. int v = 0;
  207. // for(double t = 0; t <= 2 * 3.1415 ; t+=2 * g){
  208. for(double t = 0; t <= 2 * M_PI + 0.1; t+= (2 * M_PI) / n){
  209. x = abs(x1 - x2) * cos(t);
  210. y = abs(y1 - y2) * sin(t);
  211. tab[v][0] = x + x1;
  212. tab[v][1] = y + y1;
  213. rysuj(tab[v][0],tab[v][1]);
  214. v++;
  215. }
  216. for(int i = 0 ; i < v - 1; i++){
  217. rysujprosta(tab[i][0],tab[i + 1][0],tab[i][1],tab[i + 1][1]);
  218. }
  219.  
  220.  
  221. rysujprosta(tab[v - 1][0],tab[0][0],tab[v - 1][1],tab[0][1]);
  222.  
  223.  
  224.  
  225.  
  226. update();
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement