четверг, 28 февраля 2013 г.

Квадрат (ковёр) Серпинского в SDL


В качестве упражнения на рекурсию и графику SDL написал небольшую реализацию для построения квадрата Серпинского (или как его часто называют "ковра Серпинского").
#include < SDL.h>
#include < cmath >

const int N=3; 
SDL_Surface* screen;
Uint32 color;
const int SCREEN_BPP = 32;
SDL_Event keypress;

// установить цвет (оттенок серого) 
void setColor(int i)
{
    color = SDL_MapRGB(screen->format,i,i,i);
}

// возведение m в степень 3
int pow3(int m)
{
  int i,n=1;
  for(i=0;i < m;i++)
    n*=3;
  return n;
} 
// нарисовать квадрат размера size в нужных координатах
void setSquare(int x,int y,int size)
{
    SDL_Surface *pixel = NULL;
    SDL_Rect pixelinfo;
    pixelinfo.w = size;
    pixelinfo.h = size;
    pixelinfo.x = x;
    pixelinfo.y = y;
    pixel = SDL_CreateRGBSurface(SDL_HWSURFACE,pixelinfo.w,pixelinfo.h,SCREEN_BPP,0,0,0,0);
    SDL_FillRect(pixel,NULL,color);
    SDL_BlitSurface(pixel,NULL,screen,&pixelinfo);
    SDL_FreeSurface(pixel);
}
 
// нарисовать квадрат Серпинского
void serpin(int x,int y, int s)
{
  int step;
  if(s==1)
    setSquare(x+N/2,y+N/2,1);
  else
    {
      step=pow3(s-1);
      setSquare(x+step,y+step,step);
      serpin(x,y,s-1);
      serpin(x,y+step,s-1);
      serpin(x,y+2*step,s-1);
      serpin(x+step,y+2*step,s-1);
      serpin(x+2*step,y+2*step,s-1);
      serpin(x+2*step,y+step,s-1);
      serpin(x+2*step,y,s-1);
      serpin(x+step,y,s-1);
    }
} 

int main(int argc, char* argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(81*9,81*9,SCREEN_BPP,SDL_HWSURFACE);
    SDL_WM_SetCaption("Sierpinski Carpet",NULL);
 
    setColor(200);
    serpin(1,1,7);
    
    SDL_Flip(screen);
    
    while(true)
    {
        SDL_WaitEvent(&keypress);
        if(keypress.type == SDL_QUIT) break;
    }
    SDL_Quit();
    return 0;
}

Результат выполнения программы в Mountain Lion:

Комментариев нет:

Отправить комментарий