#include #include #include #define RND ((float)rand( )/RAND_MAX) #define True 1 #define False 0 #define WINSIZE 500 #define ROWSIZE 2000 void display(void); void idle(void); void init(void); int main(int argc, char** argv); float j; int row[ROWSIZE], old_row[ROWSIZE]; int rule(int left, int top, int right) { if(!left & (top | right)) { return True; } else if(left & !top & !right) { return True; } else { return False; } } void display( ) { int i, out, tmp; glPointSize(0.5); glBegin(GL_POINTS); for(i = 0; i < ROWSIZE; i++) { if(i == 0) { out = rule(0, row[i], row[i+1]); } else if(i == ROWSIZE-1) { out = rule(row[i-1], row[i], 0); } else { out = rule(row[i-1], row[i], row[i+1]); } if(out) { glColor3f(0.3, 0.9, 0.1); } else { glColor3f(0.3, 0.3, 0.3); } old_row[i] = out; glVertex3f(ROWSIZE/4 - i*0.4, j, 0.0); } for(i = 0; i < ROWSIZE; i++) { tmp = row[i]; row[i] = old_row[i]; old_row[i] = tmp; } glEnd( ); glutSwapBuffers( ); /* int k = rule(True, True, True);*/ /* printf("%d\n", k);*/ j -= 0.6; } void idle( ) { glutPostRedisplay( ); } void init( ) { int i; glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_FLAT); glLoadIdentity( ); glOrtho(- WINSIZE/2, WINSIZE/2, - WINSIZE/2, WINSIZE/2, -2.0, 2.0); glClear(GL_COLOR_BUFFER_BIT); j = WINSIZE/2.0 + 20; for(i = 0; i < ROWSIZE; i++) { row[i] = 0; old_row[i] = 0; } row[ROWSIZE/2] = 1; } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(WINSIZE, WINSIZE); glutInitWindowPosition(0,0); glutCreateWindow("Rule 30 Cellular Automata"); init( ); glutDisplayFunc(display); glutIdleFunc(idle); glutMainLoop( ); return 0; }