Advertisement
Guest User

(C++) SDL Mandelbrot set

a guest
Oct 19th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <SDL2/SDL.h>
  3. #include <SDL2/SDL_image.h>
  4.  
  5. static int scr_width;
  6. static int scr_height;
  7. static SDL_Window* winsource;
  8. static SDL_Renderer* winrenderer;
  9.  
  10. struct Camera
  11. {
  12.     float xoffset, yoffset;
  13.     double zoom;
  14.     int detail;
  15.     float colorshift;
  16. };
  17.  
  18. static Camera cam;
  19.  
  20. struct ColorRGB
  21. {
  22.     unsigned char r,g,b;
  23. };
  24.  
  25.  
  26. void Init(int width, int height)
  27. {
  28.     // SDL Init
  29.     SDL_Init(SDL_INIT_VIDEO);
  30.     IMG_Init(IMG_INIT_PNG);
  31.    
  32.     // Create Window/Renderer
  33.     scr_width = width;
  34.     scr_height = height;
  35.     cam.xoffset = 0;
  36.     cam.yoffset = 0;
  37.     cam.zoom = 2.5;
  38.     cam.detail = 50;
  39.     cam.colorshift = 1.0;
  40.    
  41.     winsource = SDL_CreateWindow("SDL Test",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,scr_width,scr_height,SDL_WINDOW_OPENGL);
  42.     winrenderer = SDL_CreateRenderer(winsource, -1, SDL_RENDERER_ACCELERATED);
  43. }
  44.  
  45. void SDLEnd()
  46. {
  47.     SDL_DestroyRenderer(winrenderer);
  48.     SDL_DestroyWindow(winsource);
  49.     SDL_Quit();
  50. }
  51.  
  52. inline double nmap(double x, double from, double to, double mapfrom, double mapto)
  53. {
  54.     return (x-from)/(to-from) * (mapto-mapfrom) + mapfrom;
  55. }
  56.  
  57. inline float hue2rgb(float p, float q, float t)
  58. {
  59.     if(t < 0) t += 1;
  60.     if(t > 1) t -= 1;
  61.     if(t < 1./6.) return p + (q - p) * 6 * t;
  62.     if(t < 1./2.) return q;
  63.     if(t < 2./3.) return p + (q - p) * (2./3. - t) * 6;
  64.     return p;
  65. }
  66.  
  67. ColorRGB hslToRgb(float h, float s, float l){
  68.     float r, g, b;
  69.  
  70.     if(s == 0)
  71.     {
  72.         r = g = b = l; // achromatic
  73.     }
  74.     else
  75.     {
  76.         float q = (l < 0.5) ? (l * (1 + s)) : (l + s - l * s);
  77.         float p = 2 * l - q;
  78.         r = hue2rgb(p, q, h + 1./3.);
  79.         g = hue2rgb(p, q, h);
  80.         b = hue2rgb(p, q, h - 1./3.);
  81.     }
  82.     return (ColorRGB) {floor(r * 255), floor(g * 255), floor(b * 255)};
  83. }
  84.  
  85.  
  86. float MandleFind(double& xi, double& yi, int range, unsigned long inf)
  87. {
  88.     register int i;
  89.    
  90.     double oldxi = xi;
  91.     double oldyi = yi;
  92.     Camera oldcam = cam;
  93.    
  94.     for(i = 0; i < range; i++)
  95.     {
  96.         double xx = (xi*xi) - (yi*yi);
  97.         double yy = 2 * xi * yi;
  98.         xi = xx + oldxi;
  99.         yi = yy + oldyi;
  100.         if( abs(xx+yy) > inf) break;
  101.     }
  102.     float part = (float)i/range;
  103. }
  104.  
  105. void Draw()
  106. {
  107.     ColorRGB pixel;
  108.     #define dUpdateColor(h,l) pixel = hslToRgb(h,0.6,l); SDL_SetRenderDrawColor(winrenderer, pixel.r,pixel.g,pixel.b, 0xFF)
  109.     dUpdateColor(0,1.0);
  110.    
  111.     for(int y = 0; y < scr_height; y++)
  112.     {
  113.         for(int x = 0; x < scr_width; x++)
  114.         {
  115.             double adir = nmap(x,0,scr_width,-cam.zoom,cam.zoom)+cam.xoffset;
  116.             double bdir = nmap(y,0,scr_height,-cam.zoom,cam.zoom)+cam.yoffset;
  117.             float mandleHit = MandleFind(adir,bdir,cam.detail,16);
  118.             //printf("%f\n",mandleHit);
  119.             dUpdateColor(cam.colorshift*mandleHit,0.5);
  120.            
  121.             SDL_RenderDrawPoint(winrenderer,x,y);
  122.         }
  123.     }
  124.     SDL_RenderPresent(winrenderer);
  125. }
  126.  
  127. void Update()
  128. {
  129.     SDL_Event ev;
  130.     while(true)
  131.     {
  132.         SDL_PollEvent(&ev);
  133.         double czoom = cam.zoom/2.5;
  134.         if(ev.type == SDL_QUIT) break;
  135.         if(ev.type == SDL_KEYDOWN)
  136.         {
  137.             SDL_Keycode skey = ev.key.keysym.sym;
  138.             switch(skey)
  139.             {
  140.                 case SDLK_LEFT:
  141.                     cam.xoffset -= 0.2 * czoom;
  142.                     Draw();
  143.                 break;
  144.                 case SDLK_RIGHT:
  145.                     cam.xoffset += 0.2 * czoom;
  146.                     Draw();
  147.                 break;
  148.                 case SDLK_UP:
  149.                     cam.yoffset -= 0.2 * czoom;
  150.                     Draw();
  151.                 break;
  152.                 case SDLK_DOWN:
  153.                     cam.yoffset += 0.2 * czoom;
  154.                     Draw();
  155.                 break; 
  156.                 case SDLK_w:
  157.                     cam.zoom *= 0.5;
  158.                     cam.detail += 5;
  159.                     Draw();
  160.                 break;
  161.                 case SDLK_s:
  162.                     cam.zoom /= 0.5;
  163.                     cam.detail -= 5;
  164.                     Draw();
  165.                 break;
  166.             }
  167.         }
  168.     }
  169. }
  170.  
  171. int main()
  172. {
  173.     Init(320,200);
  174.     Draw();
  175.     Update();
  176.     SDLEnd();
  177.     return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement