Advertisement
Guest User

Untitled

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