⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 complexity.c

📁 基于复杂度的睡眠脑电动力学分析 C语言实现
💻 C
字号:
/* This program demonstrates how to use the stencil buffer to visualize** the depth complexity of a scene.*/#include <stdio.h>#include <stdlib.h>
#include <GL/GLUT.h>/* show contents of stencil buffer */int winwid = 512;int winht = 512;GLubyte *stencil = 0; /* so realloc works the first time */void resize(int wid, int ht){    winwid = wid;    winht = ht;    stencil = (GLubyte *)realloc((void*)stencil,                                 winwid * winht * sizeof(GLubyte));    glViewport(0, 0, wid, ht);}/* ARGSUSED1 */void key(unsigned char key, int x, int y){    if(key == '\033')        exit(0);}int rotate = 0;GLfloat udangle = 0.f;GLfloat lrangle = 0.f;void motion(int x, int y){    if(rotate)    {        udangle = (y - winht/2) * 360./winht;        lrangle = (x - winwid/2) * 360./winwid;    }    glutPostRedisplay();}void mouse(int button, int state, int x, int y){    if(state == GLUT_DOWN)    switch(button)    {    case GLUT_LEFT_BUTTON: /* rotate the scene up and down */    case GLUT_MIDDLE_BUTTON: /* rotate the scene left and right */        rotate = 1;        motion(x, y);        break;    }    else        rotate = 0; /* overkill; cover right button too */}/* read back stencil buffer, store in memory, draw back colorized */void showstencil(void){    glReadPixels(0, 0, winwid, winht, GL_STENCIL_INDEX,                  GL_UNSIGNED_BYTE, stencil);    glRasterPos2i(-1, -1);    glDrawPixels(winwid, winht, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, stencil);}int showdepth = 0;int depthtest = 1;/* Called when window needs to be redrawn */void redraw(void){    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);    glEnable(GL_STENCIL_TEST);    if(depthtest)        glEnable(GL_DEPTH_TEST);    glPushMatrix();    glRotatef(lrangle, 0.f, 1.f, 0.f);    glRotatef(udangle, 1.f, 0.f, 0.f);    glCallList(1); /* draw scene */    glPopMatrix();    glDisable(GL_STENCIL_TEST);    glFlush(); /* high end machines may need this */    if(depthtest)        glDisable(GL_DEPTH_TEST);    if(showdepth)        showstencil();    if(glGetError()) /* to catch programming errors; should never happen */       printf("Oops! I screwed up my OpenGL calls somewhere\n");    glutSwapBuffers();}/* menu entries mapped to actions */enum {RENDER, SHOW_STENCIL, DEPTH_TEST};void menu(int choice){    switch(choice)    {    case RENDER:        showdepth = 0;        break;    case SHOW_STENCIL:        showdepth = 1;        break;    case DEPTH_TEST:        depthtest = !depthtest;        if(depthtest)            /* show how many pixels were discarded by depth test */            glStencilOp(GL_KEEP, GL_INCR, GL_KEEP);        else            /* show how many pixels were written to frame buffer */            glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);        break;    }    glutPostRedisplay();}typedef struct {    GLfloat r;    GLfloat g;    GLfloat b;} Color; /* color map to indicate different depth complexities */Color map[] = {    {0.f, 0.f, 0.f,},    {0.f, .25f, 0.f,},    {0.f, .5f, 0.f,},    {0.f, .75f, 0.f,},    {0.f, 1.f, 0.f,},    {.25f, 1.f, 0.f,},    {.5f, 1.f, 0.f,},    {.75f, 1.f, 0.f,},    {1.f, 1.f, 0.f,},    {1.f, .75f, 0.f,},    {1.f, .5f, 0.f,},    {1.f, .25f, 0.f,},    {1.f, .0f, 0.f,},    {1.f, .0f, 0.f,},    {1.f, .0f, 0.f,},    {1.f, .0f, 0.f,}};/* mapsize should be a power of two */#define mapsize 16GLfloat lightpos[4] = {.5f, .5f, -1.f, 1.f};main(int argc, char *argv[]){    GLfloat rmap[mapsize], gmap[mapsize], bmap[mapsize];    int i;    glutInit(&argc, argv);    glutInitWindowSize(winwid, winht);    glutInitDisplayMode(GLUT_RGBA|GLUT_STENCIL|GLUT_DOUBLE|GLUT_DEPTH);    (void)glutCreateWindow("visualizing depth complexity");    glutDisplayFunc(redraw);    glutKeyboardFunc(key);    glutReshapeFunc(resize);    glutMouseFunc(mouse);    glutMotionFunc(motion);    glutCreateMenu(menu);    glutAddMenuEntry("Draw Scene", RENDER);    glutAddMenuEntry("Show Stencil", SHOW_STENCIL);    glutAddMenuEntry("Toggle Depth Test", DEPTH_TEST);    glutAttachMenu(GLUT_RIGHT_BUTTON);    glStencilFunc(GL_ALWAYS, ~0, ~0);    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);    /* draw an interesting scene */    glNewList(1, GL_COMPILE);    /* center */    glPushMatrix();    glScalef(.2f, .2f, .2f);    glutSolidTetrahedron();    glPopMatrix();    /* right */    glTranslatef(.4f, 0.f, 0.f);    glutSolidSphere(.25, 8, 8);    /* left */    glTranslatef(-.8f, 0.f, 0.f);    glutSolidSphere(.25, 8, 8);    /* bottom */    glTranslatef(.4f, -.4f, 0.f);    glutSolidSphere(.25, 8, 8);    /* top */    glTranslatef(0.f, .8f, 0.f);    glutSolidSphere(.25, 8, 8);    /* lefttop */    glTranslatef(-.5f, .1f, 0.f);    glutSolidCube(.3);    /* righttop */    glTranslatef(1.f, 0.f, 0.f);    glutSolidCube(.3);    /* rightbot */    glTranslatef(0.f, -1.f, 0.f);    glutSolidCube(.3);    /* rightbot */    glTranslatef(-1.f, 0.f, 0.f);    glutSolidCube(.3);    glEndList();    /* color ramp to show increasing complexity */    /* black shading to green to yellow to red */    for(i = 0; i < mapsize; i++)    {        rmap[i] = map[i].r;        gmap[i] = map[i].g;        bmap[i] = map[i].b;    }    glPixelMapfv(GL_PIXEL_MAP_I_TO_R, mapsize, rmap);    glPixelMapfv(GL_PIXEL_MAP_I_TO_G, mapsize, gmap);    glPixelMapfv(GL_PIXEL_MAP_I_TO_B, mapsize, bmap);    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);    glLightfv(GL_LIGHT0, GL_POSITION, lightpos);    glutMainLoop();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -