• [OpenGL]点阵显示生日快乐小程序


    刚工作没多久的时候,业余学习了OGL的知识(这是写不好的借口吧),

    在某个异性生日的时候写了这个程序。

    编译平台: MinGW GCC

    gcc -o happOK happyOK.c -lglut32 -lglu32 -lopengl32

    效果图(不太会转gif,好粗糙……):

    不太完整

    代码、exe、glut32.dll opengl32.dll打包

    http://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
    ",
            button,state,mousex,mousey);
        int whoi;
        if (button==0) {
            if (state==0) {
                whoi=who(mousex,winheight-mousey);
                if (whoi != -1) {
                    printf("ang=%f
    ",box[whoi].ang);
                    sometest(whoi);
                    // beep -> system("nircmd beep 2340" " 300");
                }
            }
        }
    }
    
    void reshape(int x,int y) {
        printf("%d %d
    ",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
    ",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;}
    }
  • 相关阅读:
    C++ Primer读书笔记
    谨慎使用多线程中的fork
    C++中多线程与Singleton的那些事儿
    浅谈指针的比较
    条件变量的陷阱与思考
    2014年终总结
    循环队列的一种实现模型
    react-native使用jest、enzyme进行单元测试
    富文本编辑器开发原理
    模拟实现单元测试中的异步测试
  • 原文地址:https://www.cnblogs.com/paktc/p/3430287.html
Copyright © 2020-2023  润新知