#define cimg_display_type 1 #define cimg_OS 1 #include "/usr/include/CImg.h" #include #include #include #define WIDTH 200 #define HEIGHT 200 #define zoom 4 unsigned char c[3] = {132,130,234}; unsigned char b[3] = {0,0,0}; using namespace cimg_library; using namespace std; class rule { char S[9]; char B[9]; public: rule(char *, char *); bool survive(int); bool birth(int); }; rule::rule(char *inS, char* inB) { int p = 0; while(inS[p]!='\0') { S[p] = inS[p]-'0'; p++; } S[p] = '\0'; p = 0; while(inB[p]!='\0') { B[p] = inB[p]-'0'; p++; } B[p] = '\0'; } bool rule::survive(int n) { int p =0; while(S[p]!='\0') { if (S[p] == n) return true; p++; } return false; } bool rule::birth(int n) { int p =0; while(B[p]!='\0') { if (B[p] == n) return true; p++; } return false; } /*paints the boolean buffer*/ void transfer_buffer(CImg *img, bool *buf) { for (int j = 0; jdraw_rectangle(i*zoom,j*zoom,(zoom-1)+i*zoom,(zoom-1)+j*zoom, c); } else { img->draw_rectangle(i*zoom,j*zoom,(zoom-1)+i*zoom,(zoom-1)+j*zoom, b); } } } /*fills a boolean buffer with random data */ void initialize_buffer(bool *buf){ srand(time(NULL)); for (int j = 0; jsurvive(n); } else { //birth next[HEIGHT*j+i] = sb->birth(n); } } } } void swapBuffers(bool *cur, bool *next){ bool *tmp; tmp = cur; cur = next; next = tmp; } void circleSeedBuffer(bool *buf){ for (int j = 0; j img(WIDTH*zoom,HEIGHT*zoom,1,3); bool buf1[WIDTH*HEIGHT]; bool buf2[WIDTH*HEIGHT]; bool video=false; bool *cur = buf1; bool *next = buf2; bool *tmp; rule *SB; if (argc!=3) { SB = new rule("235", "3"); } else { SB = new rule(argv[1], argv[2]); } if (argc==4) { video = (strcmp(argv[3], "v")==0); } // initialize_buffer(cur); randSeedBuffer(cur); transfer_buffer(&img, cur); int generation = 0; char title[50]; char file[50]; CImgDisplay disp(img, "Cellular automata"); while (!disp.is_closed) { disp.display(img); img.draw_rectangle(0,0,img.dimx(), img.dimy(), b); getNextGeneration(cur, next, SB); //swapBuffers(cur, next); tmp = cur; cur = next; next = tmp; transfer_buffer(&img, cur); disp.wait(90); sprintf(title, "Generation number %05d", generation); disp.set_title(title); if (disp.button&1){ initialize_buffer(cur); generation =0; } else if (disp.button&2){ randSeedBuffer(cur); generation =0; } if (video) { sprintf(file, "celFilm%05d.jpg", generation); img.save(file); } generation++; } return 0; }