Advertisement
Guest User

hdfjdhgj

a guest
Jan 20th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.03 KB | None | 0 0
  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <stack>
  5. #include <QColorDialog>
  6. #include <QColor>
  7. #include "floodfill.h"
  8. #include "ui_floodfill.h"
  9.  
  10. double const Pi = 3.14159265;
  11.  
  12. FloodFill::FloodFill(QWidget *parent) :
  13.     QMainWindow(parent),
  14.     ui(new Ui::FloodFill)
  15. {
  16.     ui->setupUi(this);
  17.     szer=ui->frame->width();
  18.     wys=ui->frame->height();
  19.     startX=ui->frame->x();
  20.     startY=ui->frame->y();
  21.     ilosc_katow=ui->ilosc_k->value();
  22.     Kolor = Qt::black;
  23.  
  24.     obraz=new QImage(szer,wys,QImage::Format_RGB32);
  25.     uchar *wskaznik;
  26.  
  27.     //CZYSTE POLE
  28.     for (int i=0; i<wys; i++)
  29.     {
  30.         wskaznik = obraz->scanLine(i);
  31.         for(int j=0; j<szer;j++)
  32.         {
  33.             wskaznik[4*j] = 255; //NIEBIESKI
  34.             wskaznik[4*j+1] = 255; //ZIELONY
  35.             wskaznik[4*j+2] = 255; //CZERWONY
  36.         }
  37.     }
  38. }
  39.  
  40.  
  41.  
  42. FloodFill::~FloodFill()
  43. {
  44.     delete ui;
  45. }
  46.  
  47. struct Piksel
  48. {
  49.     int x;
  50.     int y;
  51.     QColor kolorpixela;
  52. };
  53.  
  54.  
  55. void FloodFill::paintEvent(QPaintEvent *event)
  56. {
  57.     QPainter p(this);
  58.  
  59.     p.drawImage(startX,startY,*obraz);
  60. }
  61.  
  62. void FloodFill::mousePressEvent(QMouseEvent *event)
  63. {
  64.     x0 = event->x() - startX;
  65.     y0 = event->y() - startY;
  66. }
  67.  
  68. void FloodFill::mouseReleaseEvent(QMouseEvent *event)
  69. {
  70.     x1 = event->x() - startX;
  71.     y1 = event->y() - startY;
  72.  
  73.     if (Ksztalt==1 && Tryb==1) //ODCINEK
  74.     {
  75.         x1 = event->x() - startX;
  76.         y1 = event->y() - startY;
  77.         rysujodc(x0,y0,x1,y1,Kolor);
  78.         update();
  79.     }
  80.     if (Ksztalt==2 && Tryb==1) //PROSTOKAT
  81.     {
  82.         rysujprostokat(x0,y0,x1,y1);
  83.         update();
  84.     }
  85.     if (Ksztalt==3 && Tryb==1) //KOLO
  86.     {
  87.         double R=sqrt(pow(x1-x0,2)-pow(y1-y0,2));
  88.         rysujkolo(x0,y0,R);
  89.         update();
  90.     }
  91.     if (Ksztalt==4 && Tryb==1) //ELIPSA
  92.     {
  93.         rysujelipse(x0,y0,x1,y1);
  94.         update();
  95.     }
  96.     if (Ksztalt==5 && Tryb==1) //WIELOKAT
  97.     {
  98.         rysujwielokat(x0,y0,x1,y1);
  99.         update();
  100.     }
  101.     if(Tryb==2) {
  102.         Kolor2 = Qt::blue;
  103.         koloruj(x0,y0,Kolor,Kolor2);
  104.     }
  105. }
  106.  
  107. //NARZĘDZIA:
  108. void FloodFill::on_quitbutton_clicked()
  109. {
  110.     qApp -> quit();
  111. }
  112.  
  113. void FloodFill::on_wyczysc_clicked()
  114. {
  115.     wyczysc();
  116.     update();
  117. }
  118.  
  119. void FloodFill::on_odc_toggled(bool checked)
  120. {
  121.         Ksztalt=1;
  122. }
  123.  
  124. void FloodFill::on_pros_toggled(bool checked)
  125. {
  126.         Ksztalt=2;
  127. }
  128.  
  129. void FloodFill::on_kolo_toggled(bool checked)
  130. {
  131.         Ksztalt=3;
  132. }
  133.  
  134. void FloodFill::on_elip_toggled(bool checked)
  135. {
  136.         Ksztalt=4;
  137. }
  138.  
  139. void FloodFill::on_wiel_toggled(bool checked)
  140. {
  141.         Ksztalt=5;
  142. }
  143.  
  144. void FloodFill::on_NONE_toggled(bool checked)
  145. {
  146.         Ksztalt=6;
  147. }
  148.  
  149. void FloodFill::on_ilosc_k_valueChanged(int arg1)
  150. {
  151.     ilosc_katow = arg1;
  152. }
  153.  
  154. void FloodFill::on_rysuj_toggled(bool checked)
  155. {
  156.     Tryb = 1;
  157. }
  158.  
  159. void FloodFill::on_wypelnij_toggled(bool checked)
  160. {
  161.     Tryb = 2;
  162. }
  163.  
  164. void FloodFill::on_paleta_clicked()
  165. {
  166.     Kolor = QColorDialog::getColor();
  167. }
  168.  
  169. //FUNKCJE:
  170. void FloodFill::wyczysc()
  171. {
  172.     uchar *wskaznik;
  173.  
  174.     //CZYSTE POLE
  175.     for (int i=0; i<wys; i++)
  176.     {
  177.         wskaznik = obraz->scanLine(i);
  178.         for(int j=0; j<szer;j++)
  179.         {
  180.             wskaznik[4*j] = 255; //NIEBIESKI
  181.             wskaznik[4*j+1] = 255; //ZIELONY
  182.             wskaznik[4*j+2] = 255; //CZERWONY
  183.         }
  184.     }
  185. }
  186.  
  187. void FloodFill::wstawPiksel(int x, int y, int red = 0, int green = 0, int blue = 0)
  188. {
  189.     uchar *wskaznik;
  190.     if(x>=0 && y>=0 && x<szer && y<wys)
  191.     {
  192.         wskaznik = obraz->scanLine(y);
  193.         wskaznik[4*x] = blue; //NIEBIESKI
  194.         wskaznik[4*x+1] = green; //ZIELONY
  195.         wskaznik[4*x+2] = red; //CZERWONY
  196.     }
  197. }
  198.  
  199. void FloodFill::wstawPiksel(int x, int y, QColor Kolor)
  200. {
  201.     uchar *wskaznik;
  202.     if(x>=0 && y>=0 && x<szer && y<wys)
  203.     {
  204.         wskaznik = obraz->scanLine(y);
  205.         wskaznik[4*x] = Kolor.blue(); //NIEBIESKI
  206.         wskaznik[4*x+1] = Kolor.green(); //ZIELONY
  207.         wskaznik[4*x+2] = Kolor.red(); //CZERWONY
  208.     }
  209. }
  210.  
  211. QColor FloodFill::pobierzKolor(int x, int y)
  212. {
  213.     uchar *wskaznik;
  214.     QColor wynik;
  215.     wskaznik = obraz->scanLine(y);
  216.     wynik.setBlue(wskaznik[4*x]);
  217.     wynik.setGreen(wskaznik[4*x+1]);
  218.     wynik.setRed(wskaznik[4*x+2]);
  219.     return wynik;
  220. }
  221.  
  222. void FloodFill::punkty(int x, int y, int x0, int y0)
  223. {
  224.     wstawPiksel(x+x0, y+y0, Kolor);
  225.     wstawPiksel(y+x0, x+y0, Kolor);
  226.     wstawPiksel(y+x0, -x+y0, Kolor);
  227.     wstawPiksel(x+x0, -y+y0, Kolor);
  228.     wstawPiksel(-y+x0, -x+y0, Kolor);
  229.     wstawPiksel(-x+x0, -y+y0, Kolor);
  230.     wstawPiksel(-y+x0, x+y0, Kolor);
  231.     wstawPiksel(-x+x0, y+y0, Kolor);
  232. }
  233.  
  234. void FloodFill::punktyE(int x, int y, int x0, int y0)
  235. {
  236.     wstawPiksel(x + x0, y + y0);
  237.     wstawPiksel(x + x0, -y + y0);
  238.     wstawPiksel(-x + x0, -y + y0);
  239.     wstawPiksel(-x + x0, y + y0);
  240. }
  241.  
  242. void FloodFill::rysujodc(int x0, int y0, int x1, int y1, QColor Kolor)
  243. {
  244.     if (Tryb==1)
  245.     {
  246.         int roznica, X, Y, a, b, bufX, bufY;
  247.         int x = x0;
  248.         int y = y0;
  249.  
  250.         if(x0 < x1)    {
  251.             X = x1 - x0;
  252.             bufX = 1;
  253.         }
  254.         else    {
  255.             X = x0 - x1;
  256.             bufX = -1;
  257.         }
  258.  
  259.         if (y0 < y1)    {
  260.             Y = y1 - y0;
  261.             bufY = 1;
  262.         }
  263.         else    {
  264.             Y = y0 - y1;
  265.             bufY = -1;
  266.         }
  267.         wstawPiksel(x,y,Kolor);
  268.         if(X > Y)    {
  269.             b = Y * 2;
  270.             a = (Y - X) * 2;
  271.             roznica = a - X;
  272.             while(x != x1)        {
  273.                 if(roznica >= 0)            {
  274.                     roznica += a;
  275.                     y += bufY;
  276.                     x += bufX;
  277.                 }
  278.                 else            {
  279.                     x += bufX;
  280.                     roznica += b;
  281.                 }
  282.                 wstawPiksel(x,y,Kolor);
  283.             }
  284.         }
  285.         else    {
  286.             b = X * 2;
  287.             a = (X - Y) * 2;
  288.             roznica = b - Y;
  289.             while (y != y1)        {
  290.                 if(roznica >= 0)            {
  291.                     y += bufY;
  292.                     roznica += a;
  293.                     x += bufX;
  294.                 }
  295.                 else            {
  296.                     y += bufY;
  297.                     roznica += b;
  298.                 }
  299.                 wstawPiksel(x,y,Kolor);
  300.             }
  301.         }
  302.     }
  303. }
  304.  
  305. void FloodFill::rysujprostokat(int x0, int y0, int x1, int y1)
  306. {
  307.     if (Tryb==1)
  308.     {
  309.  
  310.     }
  311.  
  312. }
  313.  
  314. void FloodFill::rysujkolo(int x0, int y0, double R)
  315. {
  316.     if (Tryb==1)
  317.     {
  318.         double const Pi = 3.14;
  319.         double X, Y;
  320.         double x=x0;
  321.         double y=y0;
  322.  
  323.         double dX=0;
  324.         double dY=0;
  325.  
  326.         if(x0 < x1)
  327.         {
  328.             X = x1 - x0;
  329.         }
  330.         else
  331.         {
  332.             X = x0 - x1;
  333.         }
  334.  
  335.         if (y0 < y1)
  336.         {
  337.             Y = y1 - y0;
  338.         }
  339.         else
  340.         {
  341.             Y = y0 - y1;
  342.         }
  343.  
  344.         R=sqrt(pow(x1-x0,2)-pow(y1-y0,2));
  345.  
  346.         for(;dX <= R; dX++)
  347.         {
  348.             dY = sqrt(R * R - dX * dX);
  349.             punkty(dX, dY, x0, y0);
  350.         }
  351.     }
  352. }
  353.  
  354. void FloodFill::rysujelipse(int x0, int y0, int x1, int y1)
  355. {
  356.     if (Tryb==1)
  357.     {
  358.         double x,y,a,b;
  359.  
  360.         a=sqrt(pow((x1-x0),2)+pow((y0-y0),2));
  361.         b=sqrt(pow((x0-x0),2)+pow((y1-y0),2));
  362.  
  363.         for (double t=0; t < 2*Pi; t+=0.01)
  364.         {
  365.             x=a*cos(t);
  366.             y=b*sin(t);
  367.  
  368.             wstawPiksel(x+x0,y+y0,Kolor);
  369.             wstawPiksel(x+x0,-y+y0,Kolor);
  370.             wstawPiksel(-x+x0,y+y0,Kolor);
  371.             wstawPiksel(-x+x0,-y+y0,Kolor);
  372.         }
  373.     }
  374. }
  375.  
  376. void FloodFill::rysujwielokat(int x0, int y0, int x1, int y1)
  377. {
  378.     if (Tryb==1)
  379.     {
  380.         double a,b;
  381.         double x,y;
  382.         double X,Y;
  383.  
  384.         a = sqrt(pow((x1-x0),2)+pow((y0-y0),2));
  385.         b = sqrt(pow((x0-x0),2)+pow((y1-y0),2));
  386.  
  387.         X = a * cos(Pi/2);
  388.         Y = b * sin(Pi/2);
  389.  
  390.         for (double t=0; t<=2*Pi; t+=((2*Pi)/(ilosc_katow)))
  391.         {
  392.             x=a*cos((Pi/2)+t);
  393.             y=b*sin((Pi/2)+t);
  394.  
  395.             //wstawPiksel(x0+X,y0+Y,x0+x,y0+y);
  396.             rysujodc(x0+X,y0+Y,x0+x,y0+y,Kolor);
  397.  
  398.             X=x;
  399.             Y=y;
  400.         }
  401.     }
  402. }
  403.  
  404. void FloodFill::koloruj(int x, int y, QColor Kolor, QColor Kolor2)
  405. {
  406.     std::cout << "before";
  407.     if (Tryb==2)
  408.     {
  409.         std::cout << "after";
  410.         Piksel bufor;
  411.         std::stack<Piksel> Q;
  412.         Piksel pixel;
  413.         pixel.x=x;
  414.         pixel.y=y;
  415.         if (pobierzKolor(pixel.x,pixel.y)!=Kolor)
  416.         {
  417.             return;
  418.         }
  419.         Q.push(pixel);
  420.         while (!Q.empty())
  421.         {
  422.             Piksel pixel = Q.top();
  423.             Q.pop();
  424.             if (pobierzKolor(pixel.x,pixel.y)==Kolor)
  425.             {
  426.                 int w,e;
  427.                 w=pixel.x;
  428.                 e=pixel.x;
  429.                 while (pobierzKolor(w,pixel.y) == Kolor)
  430.                 {
  431.                     w--;
  432.                 }
  433.                 while (pobierzKolor(e,pixel.y) == Kolor)
  434.                 {
  435.                     e++;
  436.                 }
  437.                 for (int i=w+1; i<e; i++)
  438.                 {
  439.                    // wstawPiksel(i,pixel.y,Kolor);
  440.                     uchar *wskaznik;
  441.                     wskaznik = obraz->scanLine(pixel.y);
  442.                     wskaznik[4*i] = 122; //b
  443.                     wskaznik[4*i+1] = 34; //g
  444.                     wskaznik[4*i+2] = 251; //r
  445.                 }
  446.                 for (int i=w+1; i<e; i++)
  447.                 {
  448.                     if (pobierzKolor(i,pixel.y+1)==Kolor)
  449.                     {
  450.                         bufor.x = i;
  451.                         bufor.y = pixel.y+1;
  452.                         Q.push(bufor);
  453.                     }
  454.                     if (pobierzKolor(i,pixel.y-1)==Kolor)
  455.                     {
  456.                         bufor.x = i;
  457.                         bufor.y = pixel.y-1;
  458.                         Q.push(bufor);
  459.                     }
  460.                 }
  461.             }
  462.         }
  463.     }
  464. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement