В качестве упражнения на рекурсию и графику 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:
Комментариев нет:
Отправить комментарий