[OpenGL]点阵显示生日快乐小程序
刚工作没多久的时候,业余学习了OGL的知识(这是写不好的借口吧),
在某个异性生日的时候写了这个程序。
编译平台: MinGW GCC
gcc -o happOK happyOK.c -lglut32 -lglu32 -lopengl32
效果图(不太会转gif,好粗糙……):
代码、exe、glut32.dll opengl32.dll打包
https://files.cnblogs.com/paktc/HappyBirthday%E5%B0%8F%E6%95%88%E6%9E%9C.rar
代码:
#include <stdio.h> #include <stdlib.h> #include <GL/glut.h> #include <math.h> #define winwidth 500 #define winheight 500 #define ww winwidth/2 #define wh winheight/2 #define nbox 150 #define SLP 300 int winid; float anga=0.0; float boxsize=12.0; static struct { float x,y,z; float xmax,ymax,zmax; float xadd,yadd,zadd; float delta; } ang={0,0,0, 0,0,0, 0,0,0, 0.5}; static struct { float x,xnext,xadd; float y,ynext,yadd; float z,znext,zadd; float ang,angnext; } box[nbox]; int arr[36]={18,31,37,44,49,53,56,57,58,61,65,68,73,77,80,85, 86,87,88,89,90,91,92,93,94,97,101,104,109,113,116, 121,125,128,133,140}; int brr[27]={50,51,52,53,54,55,56,57,58,62,66,70,74,78,82,86, 90,94,98,99,100,101,102,103,104,105,106}; int crr[42]={18,31,36,37,38,39,40,41,42,43,44,45,46,54,55,60, 65,66,73,78,80,86,87,90,92,99,100,101,102,103,104,105, 106,110,114,116,121,126,127,128,132,138}; int drr[32]={26,29,37,41,42,43,50,53,55,63,65,68,73,77,80,84, 85,86,87,88,89,90,91,93,101,105,111,113,118,122,125,134}; int err[14]={8,21,34,45,51,56,63,75,87,92,105,118,129,140}; void drawbox(float px,float py,float pz,float ang) { glPushMatrix(); glTranslatef(px,py,pz); glRotatef(ang,1.0,0.0,0.0); glColor3f(px/winwidth,py/winwidth,0.5); glBegin(GL_POLYGON); glVertex3f(-boxsize,-boxsize,0.0); glVertex3f(-boxsize,boxsize,0.0); glVertex3f(boxsize,boxsize,0.0); glVertex3f(boxsize,-boxsize,0.0); glEnd(); /* glBegin(GL_POLYGON); glVertex3f(px-boxsize,py-boxsize,0.0); glVertex3f(px-boxsize,py+boxsize,0.0); glVertex3f(px+boxsize,py+boxsize,0.0); glVertex3f(px+boxsize,py-boxsize,0.0); glEnd(); */ glPopMatrix(); } void display(void) { int i; glClearColor(0.0,0.0,0.0,1.0); glClear(GL_COLOR_BUFFER_BIT); glPolygonMode(GL_BACK,GL_LINE); //glRotatef(0.05,1.0,1.0,0.0); if (ang.ymax>0.0) {glRotatef(ang.delta,1.0,0.0,0.0);ang.ymax-=ang.delta;} if (ang.xmax>0.0) {glRotatef(ang.delta,0.0,1.0,0.0);ang.xmax-=ang.delta;} glPushMatrix(); glTranslatef(-125.0,-200.0,0.0); for (i=0;i<144;i++) { if (box[i].ang<box[i].angnext) {box[i].ang+=2.0;} if (box[i].z<box[i].znext) {box[i].z+=box[i].zadd;} if (box[i].z>box[i].znext) {box[i].z+=box[i].zadd;} drawbox(box[i].x,box[i].y,box[i].z,box[i].ang); } glPopMatrix(); glutSwapBuffers(); } void empty(void) { static int here=0; int steper(int level); int steper1(int level); int steper2(int level); int steper3(int level); int steper4(int level); if (here==0) {here=steper(0);} if (here==1) {here=changeall(1);} if (here==2) {here=steper1(2);} if (here==3) {here=changeall(3);} if (here==4) {here=steper2(4);} if (here==5) {here=changeall(5);} if (here==6) {here=steper3(6);} if (here==7) {here=changeall(7);} if (here==8) {here=steper4(8);} glutPostRedisplay(); } void sometest(int whoi) { float i,tempx; tempx=box[whoi].ang; for (i=tempx;i<=tempx+200;i+=0.4) { box[whoi].ang=i; display(); } } void mouse(int button,int state,int mousex,int mousey) { printf("button=%d state=%d mousex=%d mousey=%d\n", button,state,mousex,mousey); int whoi; if (button==0) { if (state==0) { whoi=who(mousex,winheight-mousey); if (whoi != -1) { printf("ang=%f\n",box[whoi].ang); sometest(whoi); // beep -> system("nircmd beep 2340" " 300"); } } } } void reshape(int x,int y) { printf("%d %d\n",x,y); glViewport(0,0,x,y); /* GLint startx, GLint starty, GLsizei width, GLsizei height */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glOrtho(0.0,500.0, 0.0,500.0, 100.0,200.0); gluPerspective(80.0,1.0,10,800); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0,0.0,300.0, 0.0,0.0,0.0, 0.0,1.0,300.0); } void hitkey(unsigned char key,int mousex,int mousey) { switch (key) { case 'q': glutDestroyWindow(winid); exit(0); break; case 'a': ang.yadd=ang.delta; ang.ymax=90.0; glutPostRedisplay(); break; case 'd': ang.yadd=-ang.delta; ang.ymax=90.0; glutPostRedisplay(); break; case 'w': ang.xadd=ang.delta; ang.xmax=90.0; glutPostRedisplay(); break; case 's': ang.xadd=-ang.delta; ang.xmax=90.0; glutPostRedisplay(); break; } } void init(void) { int i; srand(time(NULL)); for (i=0;i<nbox;i++) { box[i].x=(int)(i/12)*30.0+10.0; box[i].y=(i%12)*30.0+10.0; box[i].z=0.0; box[i].ang=180.0; printf("%f %f %f\n",box[i].x,box[i].y,box[i].ang); } } int main(int argc,char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); glutInitWindowPosition(0,0); glutInitWindowSize(500,500); winid=glutCreateWindow("test"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(hitkey); glutMouseFunc(mouse); glutIdleFunc(empty); glutMainLoop(); return 0; } /*===================================================*/ int who(int x,int y) { int i,result=-1; float left,right; float up,down; for (i=0;i<nbox;i++) { left=box[i].x-boxsize; right=box[i].x+boxsize; up=box[i].y+boxsize; down=box[i].y-boxsize; if (left<x && x<right) { if (down<y && y<up) { result=i; } } } return result; } /*=====================================================*/ int steper(int level) { static int i; static float j; int fo,no=0; usleep(SLP); if (i==0) {ang.xmax=ang.x+20.0;} j+=0.5; if (j==1.0) { j=0.0; for (fo=0;fo<36;fo++) { if (arr[fo] == i) {no=1;} } if (no==0) {box[i].angnext=box[i].ang+180.0;} i++; } if (i==nbox) {i=0;return level+1;} else {return level;} } int steper1(int level) { static int i; static float j; int fo,no=0; usleep(SLP); if (i==0) { ang.xmax=180.0; } j+=0.5; if (j==1.0) { j=0.0; for (fo=0;fo<36;fo++) { if (arr[fo] == i) {no=1;} } if (no==1) {box[i].angnext=box[i].ang+180.0;} no=0; for (fo=0;fo<27;fo++) { if (brr[fo] == i) {no=1;} } if (no==0) {box[i].angnext=box[i].angnext+180.0;} box[i].znext=box[i].z+80.0; box[i].zadd=1.0; i++; } if (i==nbox) {i=0;return level+1;} else {return level;} } int steper2(int level) { static int i; static float j; int fo,no=0; usleep(SLP); if (i==0) { ang.xmax=150.0; } j+=0.5; if (j==1.0) { j=0.0; for (fo=0;fo<27;fo++) { if (brr[fo] == i) {no=1;} } if (no==1) {box[i].angnext=box[i].ang+180.0;} no=0; for (fo=0;fo<42;fo++) { if (crr[fo] == i) {no=1;} } if (no==0) {box[i].angnext=box[i].angnext+180.0;} box[i].znext=box[i].z-80.0; box[i].zadd=-1.0; i++; } if (i==nbox) {i=0;return level+1;} else {return level;} } int steper3(int level) { static int i; static float j; int fo,no=0; usleep(SLP); if (i==0) { ang.xmax=30.0; } j+=0.5; if (j==1.0) { j=0.0; for (fo=0;fo<42;fo++) { if (crr[fo] == i) {no=1;} } if (no==1) {box[i].angnext=box[i].ang+180.0;} no=0; for (fo=0;fo<32;fo++) { if (drr[fo] == i) {no=1;} } if (no==0) {box[i].angnext=box[i].angnext+180.0;} i++; } if (i==nbox) {i=0;return level+1;} else {return level;} } int steper4(int level) { static int i; static float j; int fo,no=0; usleep(SLP); j+=0.5; if (j==1.0) { j=0.0; for (fo=0;fo<32;fo++) { if (drr[fo] == i) {no=1;} } if (no==1) {box[i].angnext=box[i].ang+180.0;} no=0; for (fo=0;fo<14;fo++) { if (err[fo] == i) {no=1;} } if (no==0) {box[i].angnext=box[i].angnext+180.0;} if (no==0) {box[i].z=1000.0;} i++; } if (i==nbox) {i=0;return level+1;} else {return level;} } int changeall(int level) { static int i; usleep(SLP); box[i].angnext=box[i].ang+180.0; i++; if (i==nbox) {i=0;return level+1;} else {return level;} }