Advertisement
Karolina99

LAB5 - GKiM

Nov 13th, 2019
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.15 KB | None | 0 0
  1. #ifdef __cplusplus
  2.     #include <cstdlib>
  3. #else
  4.     #include <stdlib.h>
  5.  
  6. #endif
  7. #include <SDL/SDL.h>
  8. #include <math.h>
  9. #define pi 3.1415926536
  10. #include <time.h>
  11. #include <iostream>
  12. using namespace std;
  13.  
  14. SDL_Surface *screen;
  15. int width = 900;
  16. int height = 600;
  17. char const* tytul = "GKiM2019 - Lab 5 - Banys Karolina";
  18.  
  19. struct Linia /**wspolrzedne poczatku i konca linii**/
  20. {
  21.     int xp;
  22.     int yp;
  23.     int xk;
  24.     int yk;
  25. };
  26.  
  27. /**wspolrzedne poszczegolnych odcinkow tworzacych mlotek**/
  28. Linia wzorzec[]={{0,0,0,20}, //AB
  29.                   {0,20,10,20}, //BC
  30.                   {10,20,10,60},//CD
  31.                   {10,60,30,60},//DE
  32.                   {30,60,30,20}, //EF
  33.                   {30,20,40,20}, //FG
  34.                   {40,20,20,0}, //GH
  35.                   {20,0,0,0},}; //HA
  36. Linia mlotek[8]; /**tablica dla mlotka, mlotek to kopia zapasowa wzorca**/
  37.  
  38. void setPixel(int x, int y, Uint8 R, Uint8 G, Uint8 B);
  39. SDL_Color getPixel (int x, int y);
  40.  
  41. void czyscEkran(Uint8 R, Uint8 G, Uint8 B);
  42.  
  43. void Linia(int x1, int y1, int x2, int y2, Uint8 R, Uint8 G, Uint8 B);
  44. void Okrag(int x, int y, int r, Uint8 R, Uint8 G, Uint8 B);
  45. void Elipsa(int x, int y, int a, int b, Uint8 R, Uint8 G, Uint8 B);
  46.  
  47. void inicjalizacja() /**wpisanie do mlotka wzorca**/
  48. {
  49.     for(int i=0;i<8;i++)
  50.     {
  51.         mlotek[i]=wzorzec[i];
  52.     }
  53. }
  54.  
  55. void rysowanie(Uint8 R, Uint8 G, Uint8 B) /**rysowanie odcinkow tworzacych mlotek**/
  56. {
  57.      for(int i=0;i<8;i++)
  58.     {
  59.         Linia(mlotek[i].xp, mlotek[i].yp,mlotek[i].xk,mlotek[i].yk,R,G,B );
  60.     }
  61. }
  62.  
  63. void Funkcja1();
  64. void Funkcja2();
  65. void Funkcja3();
  66. void Funkcja4();
  67. void Funkcja5();
  68. void Funkcja6();
  69. void Funkcja7();
  70. void Funkcja8();
  71. void Funkcja9();
  72.  
  73.  
  74.  
  75. void Funkcja1() /**rysujemy mlotek**/
  76. {
  77.     inicjalizacja();
  78.     rysowanie(255,255,255);
  79.  
  80.     SDL_Flip(screen);
  81. }
  82.  
  83. void przesuniecie(int px, int py)
  84. {
  85.     for(int i=0;i<8;i++)
  86.     {
  87.         mlotek[i].xp+=px;
  88.         mlotek[i].yp+=py;
  89.         mlotek[i].xk+=px;
  90.         mlotek[i].yk+=py;
  91.     }
  92. }
  93.  
  94. void Funkcja2() /**przesuwamy mlotek tak jakby po przekatnej, nie zmieniajac jego wielkosci**/
  95. {
  96.     rysowanie(0,0,0); /**jak zakomentujemy to stare mlotki zostaja na ekranie**/
  97.     przesuniecie(20,10);
  98.     rysowanie(0,255,255);
  99.  
  100.     SDL_Flip(screen);
  101. }
  102.  
  103. void skalowanie(float sx, float sy)
  104. {
  105.     for(int i=0;i<8;i++)
  106.     {
  107.         mlotek[i].xp*=sx;
  108.         mlotek[i].yp*=sy;
  109.         mlotek[i].xk*=sx;
  110.         mlotek[i].yk*=sy;
  111.     }
  112. }
  113.  
  114. void Funkcja3() /**zwiekszamy wielkosc mlotka w odpowiednich proporcjach**/
  115. {
  116.     rysowanie(0,0,0);
  117.     int przesuniecieX = mlotek[0].xp;
  118.     int przesuniecieY = mlotek[0].yp;
  119.     przesuniecie(-przesuniecieX, -przesuniecieY);
  120.     skalowanie(1.1,1.1);
  121.     przesuniecie(przesuniecieX, przesuniecieY);
  122.     rysowanie(rand()%255,255,0);
  123.  
  124.     SDL_Flip(screen);
  125. }
  126.  
  127. bool porownajKolory(SDL_Color k1, SDL_Color k2)
  128. {
  129.     bool wynik=true;
  130.     if(k1.r!=k2.r)
  131.         wynik=false;
  132.  
  133.     if(k1.g!=k2.g)
  134.         wynik=false;
  135.  
  136.     if(k1.b!=k2.b)
  137.         wynik=false;
  138.  
  139.     return wynik;
  140. }
  141.  
  142. void sianie(int x, int y, SDL_Color kolorWypelnienia, SDL_Color
  143. kolorBrzegu)
  144. {
  145.     setPixel(x,y,kolorWypelnienia.r, kolorWypelnienia.g,
  146. kolorWypelnienia.b);
  147.  
  148.     SDL_Color kolor;
  149.     kolor=getPixel(x-1, y);
  150.     if((!porownajKolory(kolor,kolorWypelnienia)) &&
  151.         (!porownajKolory(kolor,kolorBrzegu)))
  152.     {
  153.         sianie(x-1, y, kolorWypelnienia,kolorBrzegu);
  154.     }
  155.  
  156.     kolor=getPixel(x, y-1);
  157.     if((!porownajKolory(kolor,kolorWypelnienia)) &&
  158.         (!porownajKolory(kolor,kolorBrzegu)))
  159.     {
  160.         sianie(x, y-1, kolorWypelnienia,kolorBrzegu);
  161.     }
  162.  
  163.     kolor=getPixel(x+1, y);
  164.     if((!porownajKolory(kolor,kolorWypelnienia)) &&
  165.         (!porownajKolory(kolor,kolorBrzegu)))
  166.     {
  167.         sianie(x+1, y, kolorWypelnienia,kolorBrzegu);
  168.     }
  169.  
  170.     kolor=getPixel(x, y+1);
  171.     if((!porownajKolory(kolor,kolorWypelnienia)) &&
  172.         (!porownajKolory(kolor,kolorBrzegu)))
  173.     {
  174.         sianie(x, y+1, kolorWypelnienia,kolorBrzegu);
  175.     }
  176. }
  177.  
  178. void Funkcja4() /**rysujemy okrag o okreslonym kolorze brzegu i o okreslonym kolorze wypelnienia**/
  179. {
  180.  
  181.     SDL_Color brzeg={255,255,255}; /**kolor brzegu okregu**/
  182.     SDL_Color wypelnienie={.r=255, .g=0, .b=255}; /**kolor wypelnienia okregu**/
  183.  
  184.     Okrag(300,300,50,brzeg.r,brzeg.g,brzeg.b); /**rysuje okrag o brzegu bialym**/
  185.  
  186.     sianie(300,300,wypelnienie,brzeg); /**wypelnia wnetrze okregu kolorem magenta**/
  187.  
  188.  
  189.     SDL_Flip(screen);
  190. }
  191.  
  192. /**jezeli wywolamy funkcje 5 i 4 to powstaly okrag "zasloni" linie**/
  193.  
  194. void Funkcja5() /**rysuje linie o randomowych wspolrzednych poczatku i konca tej linii i o randomowych kolorach**/
  195. {
  196.  
  197.   Linia(rand()%width, rand()%height,
  198.           rand()%width, rand()%height,
  199.           rand()%255, rand()%255, rand()%255);
  200.  
  201.     /**Linia(rand()%width, rand()%height,
  202.           rand()%width, rand()%height,
  203.           255, 0, 255);**/
  204.  
  205.     SDL_Flip(screen);
  206. }
  207.  
  208. void sianie2(int x, int y, SDL_Color kolorWypelnienia, SDL_Color kolorTla)
  209. {
  210.     setPixel(x,y,kolorWypelnienia.r, kolorWypelnienia.g, kolorWypelnienia.b);
  211.     //SDL_Flip(screen);
  212.  
  213.     SDL_Color kolor;
  214.  
  215.     kolor=getPixel(x-1, y);
  216.  
  217.     if(porownajKolory(kolor, kolorTla))
  218.     {
  219.         sianie2(x-1, y, kolorWypelnienia,kolorTla);
  220.     }
  221.  
  222.     kolor=getPixel(x, y-1);
  223.  
  224.     if(porownajKolory(kolor, kolorTla))
  225.     {
  226.         sianie2(x, y-1, kolorWypelnienia,kolorTla);
  227.     }
  228.  
  229.     kolor=getPixel(x+1, y);
  230.  
  231.     if(porownajKolory(kolor, kolorTla))
  232.     {
  233.         sianie2(x+1, y, kolorWypelnienia,kolorTla);
  234.     }
  235.  
  236.     kolor=getPixel(x, y+1);
  237.  
  238.     if(porownajKolory(kolor, kolorTla))
  239.     {
  240.         sianie2(x, y+1, kolorWypelnienia,kolorTla);
  241.     }
  242. }
  243.  
  244. /**jezeli wywolamy funkcje 6 i 5 to powstaly okrag "nie zasloni" linii**/
  245.  
  246. void Funkcja6()
  247. {
  248.  
  249.     SDL_Color tlo=getPixel(300,300);
  250.     SDL_Color wypelnienie={.r=255, .g=255, .b=0};
  251.  
  252.     Okrag(300,300,50,255,0,255);
  253.  
  254.     sianie2(300,300,wypelnienie,tlo);
  255.     SDL_Flip(screen);
  256. }
  257.  
  258.  
  259. void Funkcja7()
  260. {
  261.  
  262.   inicjalizacja();
  263.   rysowanie(0,255,255);
  264.   SDL_Color brzeg = {0,255,255};
  265.   SDL_Color wypelnienie = {255,255,0};
  266.  
  267.   sianie(mlotek[0].xp+20, mlotek[0].yp+20, wypelnienie, brzeg);
  268.  
  269.     SDL_Flip(screen);
  270. }
  271.  
  272.  
  273. void Funkcja8() {
  274.  
  275.     //...
  276.  
  277.     SDL_Flip(screen);
  278. }
  279.  
  280.  
  281. void Funkcja9() {
  282.  
  283.     //...
  284.  
  285.     SDL_Flip(screen);
  286. }
  287.  
  288.  
  289. void Linia(int x1, int y1, int x2, int y2, Uint8 R, Uint8 G, Uint8 B) {
  290.     setPixel(x1,y1,R,G,B);
  291.     setPixel(x2,y2,R,G,B);
  292.      // zmienne pomocnicze
  293.      int d, dx, dy, ai, bi, xi, yi;
  294.      int x = x1, y = y1;
  295.      // ustalenie kierunku rysowania
  296.      if (x1 < x2)
  297.      {
  298.          xi = 1;
  299.          dx = x2 - x1;
  300.      }
  301.      else
  302.      {
  303.          xi = -1;
  304.          dx = x1 - x2;
  305.      }
  306.      // ustalenie kierunku rysowania
  307.      if (y1 < y2)
  308.      {
  309.          yi = 1;
  310.          dy = y2 - y1;
  311.      }
  312.      else
  313.      {
  314.          yi = -1;
  315.          dy = y1 - y2;
  316.      }
  317.      // pierwszy piksel
  318.      setPixel(x, y, R, G, B);
  319.      // oś wiodąca OX
  320.      if (dx > dy)
  321.      {
  322.          ai = (dy - dx) * 2;
  323.          bi = dy * 2;
  324.          d = bi - dx;
  325.          // pętla po kolejnych x
  326.          while (x != x2)
  327.          {
  328.              // test współczynnika
  329.              if (d >= 0)
  330.              {
  331.                  x += xi;
  332.                  y += yi;
  333.                  d += ai;
  334.              }
  335.              else
  336.              {
  337.                  d += bi;
  338.                  x += xi;
  339.              }
  340.              setPixel(x, y, R, G, B);
  341.          }
  342.      }
  343.      // oś wiodąca OY
  344.      else
  345.      {
  346.          ai = ( dx - dy ) * 2;
  347.          bi = dx * 2;
  348.          d = bi - dy;
  349.          // pętla po kolejnych y
  350.          while (y != y2)
  351.          {
  352.              // test współczynnika
  353.              if (d >= 0)
  354.              {
  355.                  x += xi;
  356.                  y += yi;
  357.                  d += ai;
  358.              }
  359.              else
  360.              {
  361.                  d += bi;
  362.                  y += yi;
  363.              }
  364.              setPixel(x, y, R, G, B);
  365.          }
  366.      }
  367.     SDL_Flip(screen);
  368. }
  369.  
  370. void RysujOkrag(int x0, int y0, int x, int y, Uint8 R, Uint8 G, Uint8 B){
  371.     setPixel(x+x0, y+y0, R, G, B);
  372.     setPixel(y+x0, x+y0, R, G, B);
  373.     setPixel(y+x0, -x+y0, R, G, B);
  374.     setPixel(x+x0, -y+y0, R, G, B);
  375.     setPixel(-x+x0, -y+y0, R, G, B);
  376.     setPixel(-y+x0, -x+y0, R, G, B);
  377.     setPixel(-y+x0, x+y0, R, G, B);
  378.     setPixel(-x+x0, y+y0, R, G, B);;
  379. }
  380.  
  381.  
  382. void Okrag(int x0, int y0, int r, Uint8 R, Uint8 G, Uint8 B) {
  383.     int x =0;
  384.     int y=r;
  385.     int d = 3-2*r;
  386.  
  387.     while (x <= y){
  388.         if (d<0){
  389.             d=d+4*x+6;
  390.             RysujOkrag(x0, y0, x, y, R, G, B);
  391.         } else{
  392.             d=d+4*(x-y)+10;
  393.             y--;
  394.             RysujOkrag(x0, y0, x, y, R, G, B);
  395.         }
  396.         x++;
  397.     }
  398.     SDL_Flip(screen);
  399. }
  400.  
  401. void Elipsa(int x, int y, int a, int b, Uint8 R, Uint8 G, Uint8 B) {
  402.     int xc  = 0,
  403.         yc  = b;
  404.     int aa  = a * a,
  405.         aa2 = aa + aa,
  406.         bb  = b * b,
  407.         bb2 = bb + bb;
  408.     int d   = bb - aa * b + (aa / 4),
  409.         dx  = 0,
  410.         dy  = aa2 * b;
  411.  
  412.     while (dx < dy) {
  413.         setPixel (x - xc,y - yc, R, G, B);
  414.         setPixel (x - xc,y + yc, R, G, B);
  415.         setPixel (x + xc,y - yc, R, G, B);
  416.         setPixel (x + xc,y + yc, R, G, B);
  417.         if (d > 0){
  418.             yc  = yc-1;
  419.             dy -= aa2;
  420.             d  -= dy;
  421.         }
  422.         xc  =xc+1;
  423.         dx += bb2;
  424.         d  += bb + dx;
  425.     }
  426.     d += (3 * ((aa - bb) / 2) - (dx + dy) / 2);
  427.  
  428.     while (yc >= 0) {
  429.         setPixel (x - xc,y - yc, R, G, B);
  430.         setPixel (x - xc,y + yc, R, G, B);
  431.         setPixel (x + xc,y - yc, R, G, B);
  432.         setPixel (x + xc,y + yc, R, G, B);
  433.         if (d < 0) {
  434.             xc =xc+1;
  435.             dx += bb2;
  436.             d  += (bb + dx);
  437.         }
  438.         yc  = yc-1;
  439.         dy -= aa2;
  440.         d  += aa - dy;
  441.     }
  442.     SDL_Flip(screen);
  443. }
  444.  
  445.  
  446.  
  447. void setPixel(int x, int y, Uint8 R, Uint8 G, Uint8 B)
  448. {
  449.   if ((x>=0) && (x<width) && (y>=0) && (y<height))
  450.   {
  451.     /* Zamieniamy poszczególne składowe koloru na format koloru piksela */
  452.     Uint32 pixel = SDL_MapRGB(screen->format, R, G, B);
  453.  
  454.     /* Pobieramy informację ile bajtów zajmuje jeden piksel */
  455.     int bpp = screen->format->BytesPerPixel;
  456.  
  457.     /* Obliczamy adres piksela */
  458.     Uint8 *p = (Uint8 *)screen->pixels + y * screen->pitch + x * bpp;
  459.  
  460.     /* Ustawiamy wartość piksela, w zależności od formatu powierzchni*/
  461.     switch(bpp)
  462.     {
  463.         case 1: //8-bit
  464.             *p = pixel;
  465.             break;
  466.  
  467.         case 2: //16-bit
  468.             *(Uint16 *)p = pixel;
  469.             break;
  470.  
  471.         case 3: //24-bit
  472.             if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
  473.                 p[0] = (pixel >> 16) & 0xff;
  474.                 p[1] = (pixel >> 8) & 0xff;
  475.                 p[2] = pixel & 0xff;
  476.             } else {
  477.                 p[0] = pixel & 0xff;
  478.                 p[1] = (pixel >> 8) & 0xff;
  479.                 p[2] = (pixel >> 16) & 0xff;
  480.             }
  481.             break;
  482.  
  483.         case 4: //32-bit
  484.             *(Uint32 *)p = pixel;
  485.             break;
  486.  
  487.     }
  488.          /* ewentualna aktualizacja obrazu (aka double buffering) */
  489.   }
  490. }
  491.  
  492.  
  493. SDL_Color getPixel (int x, int y) {
  494.     SDL_Color color ;
  495.     Uint32 col = 0 ;
  496.     if ((x>=0) && (x<width) && (y>=0) && (y<height)) {
  497.         //określamy pozycję
  498.         char* pPosition=(char*)screen->pixels ;
  499.         //przesunięcie względem y
  500.         pPosition+=(screen->pitch*y) ;
  501.         //przesunięcie względem x
  502.         pPosition+=(screen->format->BytesPerPixel*x);
  503.         //kopiujemy dane piksela
  504.         memcpy(&col, pPosition, screen->format->BytesPerPixel);
  505.         //konwertujemy kolor
  506.         SDL_GetRGB(col, screen->format, &color.r, &color.g, &color.b);
  507.     }
  508.     return ( color ) ;
  509. }
  510.  
  511. void czyscEkran(Uint8 R, Uint8 G, Uint8 B)
  512. {
  513.     SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, R, G, B));
  514.     SDL_Flip(screen);
  515.  
  516. }
  517.  
  518.  
  519.  
  520. int main ( int argc, char** argv )
  521. {
  522.     // console output
  523.     freopen( "CON", "wt", stdout );
  524.     freopen( "CON", "wt", stderr );
  525.  
  526.     // initialize SDL video
  527.     if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
  528.     {
  529.         printf( "Unable to init SDL: %s\n", SDL_GetError() );
  530.         return 1;
  531.     }
  532.  
  533.     // make sure SDL cleans up before exit
  534.     atexit(SDL_Quit);
  535.  
  536.     // create a new window
  537.     screen = SDL_SetVideoMode(width, height, 32,
  538.                                            SDL_HWSURFACE|SDL_DOUBLEBUF);
  539.     if ( !screen )
  540.     {
  541.         printf("Unable to set video: %s\n", SDL_GetError());
  542.         return 1;
  543.     }
  544.  
  545.     SDL_WM_SetCaption( tytul , NULL );
  546.     // program main loop
  547.     bool done = false;
  548.     while (!done)
  549.     {
  550.         // message processing loop
  551.         SDL_Event event;
  552.         while (SDL_PollEvent(&event))
  553.         {
  554.             // check for messages
  555.             switch (event.type)
  556.             {
  557.                 // exit if the window is closed
  558.             case SDL_QUIT:
  559.                 done = true;
  560.                 break;
  561.  
  562.                 // check for keypresses
  563.             case SDL_KEYDOWN:
  564.                 {
  565.                     // exit if ESCAPE is pressed
  566.                     if (event.key.keysym.sym == SDLK_ESCAPE)
  567.                         done = true;
  568.                     if (event.key.keysym.sym == SDLK_1)
  569.                         Funkcja1();
  570.                     if (event.key.keysym.sym == SDLK_2)
  571.                         Funkcja2();
  572.                     if (event.key.keysym.sym == SDLK_3)
  573.                         Funkcja3();
  574.                     if (event.key.keysym.sym == SDLK_4)
  575.                         Funkcja4();
  576.                     if (event.key.keysym.sym == SDLK_5)
  577.                         Funkcja5();
  578.                     if (event.key.keysym.sym == SDLK_6)
  579.                         Funkcja6();
  580.                     if (event.key.keysym.sym == SDLK_7)
  581.                         Funkcja7();
  582.                     if (event.key.keysym.sym == SDLK_b)
  583.                         czyscEkran(0, 0, 10);          break;
  584.                      }
  585.             } // end switch
  586.         } // end of message processing
  587.  
  588.     } // end main loop
  589.  
  590.  
  591.     // all is well ;)
  592.     printf("Exited cleanly\n");
  593.     return 0;
  594. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement