Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10660
  • 博文数量: 8
  • 博客积分: 335
  • 博客等级: 一等列兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-26 20:11
文章分类

全部博文(8)

文章存档

2008年(8)

我的朋友
最近访客

分类: C/C++

2008-10-25 20:12:55

//<< 计算机图形学>>第1章样例程序
#include
#include
#include
#include


#define ROWS 10
#define COLS 30
#define AMBIENT 25.0
#define HOT 50.0
#define COLD 0.0
#define NHOTS 4
#define NCOLDS 5
GLfloat angle =0.0;
GLfloat temps[ROWS][COLS] ,back[ROWS+2][COLS+2];
GLfloat theta =0.0,vp=30.0;

int hotspots[NHOTS][2]=
    { {ROWS/2,0}, {ROWS/2-1,0},{ROWS/2-2,0},{0,3*COLS/4}};


int coldspots[NCOLDS][2]=
    { {ROWS-1,COLS/3 },{ROWS-1,1+COLS/3 },{ROWS-1,2+COLS/3 },{ROWS-1,3+COLS/3 },{ROWS-1,5+COLS/3 }};

int myWin,w,h;
void myinit(void){
    int i,j;
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.6,0.6,0.6,1.0);
    for (i=0;i        for (j=0;j            temps[i][j] = AMBIENT;
                       }       
    }
    for (i=0;i        temps[hotspots[i][0]][hotspots[i][1]]=HOT;
         for (i=0;i        temps[coldspots[i][0]] [coldspots[i][1]]=COLD;   
}


void cube(void){
typedef GLfloat point[3];
point v[8]={
    {0.0, 0.0, 0.0},{0.0, 0.0,1.0},
    {0.0, 1.0, 0.0},{0.0, 1.0, 1.0},
    {1.0, 0.0, 0.0},{1.0, 0.0, 1.0},
    {1.0, 1.0, 0.0},{1.0, 1.0, 1.0}
      };
glBegin(GL_QUAD_STRIP);
    glVertex3fv(v[4]);
    glVertex3fv(v[5]);
    glVertex3fv(v[0]);
    glVertex3fv(v[1]);
    glVertex3fv(v[2]);
    glVertex3fv(v[3]);
    glVertex3fv(v[6]);
    glVertex3fv(v[7]);
glEnd();
    glBegin(GL_QUAD_STRIP);
    glVertex3fv(v[1]);
    glVertex3fv(v[3]);
    glVertex3fv(v[5]);
    glVertex3fv(v[7]);
    glVertex3fv(v[4]);
    glVertex3fv(v[6]);
    glVertex3fv(v[0]);
    glVertex3fv(v[2]);
glEnd();
}

void setColor(float t) {
    float r,g,b;
    r=(t-COLD)/(HOT-COLD);
    g=0.0;
    b=1.0-r;
    glColor3f(r,g,b);
}

void display(void){
    #define SCALE 10,0
    int i,j;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glViewport(0,0,(GLsizei)w/2,(GLsizei)h);   
   
        glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   
    gluPerspective(60.0,((float)w/2)/(float)h,1.0,300.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(vp,vp/2.,vp/4.,0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
    glPushMatrix();
    glRotatef(angle,0., 0., 1.0);
    for (i=0;i        for(j=0;j        setColor(temps[i][j]);
        glPushMatrix();
   
    glTranslatef((float)i-(float)ROWS/2.0,
             (float)j-(float)COLS/2.0,0);
    glScalef(1.0,1.0,0.1+3.9*temps[i][j]/HOT);
    cube();
    glPopMatrix();
        }
    }
    glPopMatrix();
   
   
    glViewport((GLsizei)w/2,0,(GLsizei)w/2,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0,((float)w/2)/(float)h,1.0,300.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(vp,-vp/2.,vp/4.,0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

    glPushMatrix();
    glRotatef(angle,0., 1.0, 1.0);
    for (i=0;i        for(j=0;j        setColor(temps[i][j]);
        glPushMatrix();
   
    glTranslatef((float)i-(float)ROWS/2.0,
             (float)j-(float)COLS/2.0,0);
    glScalef(1.0,1.0,0.1+3.9*temps[i][j]/HOT);
    cube();
    glPopMatrix();
        }
    }
    glPopMatrix();
    glutSwapBuffers();


   
}


void reshape(int width ,int high){
   
         w=width;h=high;
    glutPostRedisplay();
}




void iterationStep(void){
    int i,j,m,n;
    float filter[3][3]={ {0.,    0.125,0.},{0.125,    0.5,    0.125},
               
                {0.,    0.125,    0.}};
    for (i=0;i        for (j=0;j        }
    for (i=1;i        back[i][0]=back[i][1];
        back[i][COLS+1]=back[i][COLS];
        }
    for(j=0;j        back[0][j]=back[1][j];
        back[ROWS+1][j]=back[ROWS][j];
        }
    for (i=0;i        for (j=0;j            temps[i][j]=0.0;
            for (m=-1;m<=1;m++)
                for(n=-1;n<=1;n++)
                    temps[i][j]=temps[i][j]+back[i+1+m][j+1+n]*filter[m+1][n+1];
    }
    for (i=0;i        {temps[hotspots[i][0]][hotspots[i][1]]=HOT;}
    for (i=0;i          {temps[coldspots[i][0]][coldspots[i][1]]=COLD;}
    angle+=0.25;
   
}

void animate(void){
    iterationStep();
    glutPostRedisplay();
}



int main(int argc,char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);
    glutInitWindowSize(1000,500);
    glutInitWindowPosition(50,50);
    myWin= glutCreateWindow("Twohead");
    myinit();
       


    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(animate);
    glutMainLoop();
}

阅读(260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~