Advertisement
Guest User

Untitled

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