Wyżarzanie
-- Sebastian Pawlak, 2003.
Wyżarzanie zostało zaimplementowane z wykorzystaniem biblioteki
graficznej SDL w Microsoft Visual Studio.
Stany komórek: 0, 1.
Sąsiedztwo Moora: R=1.
Reguły: jeśli suma wartości sąsiadów oraz rozpatrywanej komórki jest 0,1,2,3 lub 5, to nowy stan komórki jest 0, w przeciwnym wypadku 1.
Warunki początkowe losowe, gęstość (pól z wartością 1): 50%.
Kod źródłowy pliku "wyzarzanie.cpp":
/****************************** * WYZARZANIE * * Sebastian Pawlak * ******************************/ #include <math.h> #include <stdlib.h> #include <string.h> #include "..\SDL-1.2.5\include\sdl.h" #include "..\SDL-1.2.5\include\SDL_endian.h" void Slock(SDL_Surface *screen) { if (SDL_MUSTLOCK(screen) && SDL_LockSurface(screen) < 0) return; } void Sulock(SDL_Surface *screen) { if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); } void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B) { Uint32 color = SDL_MapRGB(screen->format, R, G, B); if (SDL_MUSTLOCK(screen) && SDL_LockSurface(screen) < 0) return; switch (screen->format->BytesPerPixel) { case 1: { /* 8-bpp */ Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y * screen->pitch + x; *bufp = color; } break; case 2: { /* 15-bpp lub 16-bpp */ Uint16 *bufp; bufp = (Uint16 *)screen->pixels + y * screen->pitch / 2 + x; *bufp = color; } break; case 3: { /* powolony tryb 24-bpp */ Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y * screen->pitch + x * 3; if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { bufp[0] = color; bufp[1] = color >> 8; bufp[2] = color >> 16; } else { bufp[2] = color; bufp[1] = color >> 8; bufp[0] = color >> 16; } } break; case 4: { /* 32-bpp */ Uint32 *bufp; bufp = (Uint32 *)screen->pixels + y * screen->pitch / 4 + x; *bufp = color; } break; } if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); } enum { MAXX = 512, /* rozmiar planszy */ MAXY = 512 }; short int plansza[MAXX][MAXY]; /* plansza aktualna */ short int plansza2[MAXX][MAXY]; /* plansza po przeksztalceniach */ int main(int argc, char* argv[]) { /* losowe tworzenie planszy poczatkowej */ for (int x = 0; x < MAXX; x++) for (int y = 0; y < MAXY; y++) { int w = rand() % 2; if (w == 0) plansza2[x][y] = plansza[x][y] = 1; else plansza2[x][y] = plansza[x][y] = 0; } /* inicjalizacja biblioteki SDL */ SDL_Init(SDL_INIT_VIDEO); atexit ( SDL_Quit ) ; SDL_Surface *pSurface = SDL_SetVideoMode(MAXX, MAXY, 0, SDL_ANYFORMAT); SDL_Event event; SDL_WM_SetCaption("Wyżarzanie", NULL); while (1) { Slock(pSurface); SDL_Rect rect = { 0, 0, MAXX, MAXY }; SDL_FillRect(pSurface, &rect, SDL_MapRGB(pSurface->format, 255, 255, 255)); for (x = 0; x < MAXX; x++) for (int y = 0; y < MAXY; y++) { /* zmiana stanu automatu */ int w = 0; for (int xx = (x == 0 ? 0 : -1); xx <= (x == MAXX - 1 ? 0 : 1); xx++) for(int yy = (y == 0 ? 0 : -1); yy <= (y == MAXY - 1 ? 0 : 1); yy++) if (plansza[x + xx][y + yy] == 1) w++; if (w == 0 || w == 1 || w == 2 || w == 3 || w == 5) plansza2[x][y] = 0; else plansza2[x][y] = 1; /* wyswietlanie komorki na ekranie */ if (plansza[x][y] == 1) DrawPixel(pSurface, x, y, 255, 0, 0); } Sulock(pSurface); SDL_Flip(pSurface); /* kopiowanie planszy wynikowej do planszy pierwotnej */ for (x = 0; x < MAXX; x++) memcpy(&plansza[x][0], &plansza2[x][0], sizeof(plansza[0][0]) * MAXY); /* obsluga zdarzen */ while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) exit(0); if (event.type == SDL_MOUSEBUTTONDOWN) plansza[event.button.x][event.button.y] = plansza2[event.button.x][event.button.y] = 1; } } return 0; }