level 1
#include <glut.h>
#include <iostream>
#define GLUT_DISABLE_ATEXIT_HACK
using namespace std;
typedef unsigned char store;
store lattice[100][100], latticeTemp[100][100];
void Initialize();
void Display();
void Reshape(int width, int height);
void onTimer(int id);
unsigned int tt=100;
int step=0;
void init()
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
{
lattice[i][j]=0;
latticeTemp[i][j]=0;
}
for(int i=0;i<100;i++)
{
lattice[i][0] = 16;
lattice[i][99] =16;
}
for(int j=1;j<99;j++)
{
lattice[0][j] = 16;
lattice[99][j] =16;
}
for(int j=1;j<99;j++)
{
if(j<47) lattice[49][j] = 16;
if(j>55) lattice[49][j] = 16;
}
for(int i=1;i<49;i++)
for(int j=1;j<100;j++)
for(int k=0;k<4;k++)
{
double den=0.25;
double r=rand()/(float)RAND_MAX;
if(int(den + r))
lattice[i][j] |= 1<<k;
}
//lattice[50][50] = 1;lattice[80][50] =4;
}
void boundary()
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
{
if(lattice[i][j]&16)
{
lattice[i][j] = ((lattice[i][j]&3)<<2) + ((lattice[i][j]&12)>>2) + 16;
}
}
}
void collision()
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
{
if((lattice[i][j]&16)==0)
{
if(lattice[i][j]==5) lattice[i][j] += 5;
else if(lattice[i][j]==10)lattice[i][j] -= 5;
}
}
}
void move()
{
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
{
latticeTemp[i][j] = lattice[i][j];
lattice[i][j]=0;
lattice[i][j] = (latticeTemp[i][j]&16);
}
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
{
if(latticeTemp[i][j]&1)lattice[i+1][j] += 1;
if(latticeTemp[i][j]&2)lattice[i][j+1] += 2;
if(latticeTemp[i][j]&4)lattice[i-1][j] += 4;
if(latticeTemp[i][j]&8)lattice[i][j-1] += 8;
}
}
void Initialize()
{
glClearColor(1.0, 1.0, 1.0, 1.0);//设置窗口当前背景色
glColor3ub(255, 255, 255);//设置当前画笔色
glShadeModel(GL_FLAT);
}
void Reshape(int width, int height)
{
if (height == 0)
return;
glViewport(0, 0, (GLsizei) 1*width, (GLsizei) 1*height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-15, 400, -5, 175);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//初始化窗口类型
glutInitWindowSize(1000, 600);//初始化窗口尺寸,单位像素
glutInitWindowPosition(100, 100);//初始化窗口位置,窗口左上角相对于屏幕左上角的位置,单位像素
glutCreateWindow("Parabola");//初始化窗口标题
Initialize();
init();
glutTimerFunc(tt,onTimer,1);
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存
glClearColor(0,0,0,0);
glColor3ub(255,255,0);
glLineWidth(1.0f);
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(100, 0);
glVertex2f(0, 0);
glVertex2f(0, 100);
glVertex2f(0, 100);
glVertex2f(100, 100);
glVertex2f(100, 0);
glVertex2f(100, 100);
glEnd();
glColor3ub(255,255,255);
glBegin(GL_POINTS);
for(int i = 0; i < 100; i++)
for(int j = 0; j < 100; j++)
{
if(lattice[i][j]&0x0f)
glVertex2f(i+0.5,j+0.5);
}
glEnd();
glutSwapBuffers();
}
void onTimer(int id)
{
boundary();
collision();
move();
step++;
glutPostRedisplay();
glutTimerFunc(tt,onTimer,1);
}
2017年05月26日 08点05分
