基本涵盖计算机图形学所有知识点的一个场景
2016-04-09 01:44
429 查看
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include<windows.h>
//#include <glaux.h>
#include<iostream.h>
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#define PI 3.14159265358979323846f
#define WIDTH 800
#define HEIGHT 600
#define MAX_CHAR 128
static GLfloat angle=0.0f,cangle=0.0f,cangle1=90.0f,pangle=0.0f,pangle1=0.0f,pangle2=0.0f,pangle3=0.0f,pangle4=0.0f,pangle5=0.0f,pangle6=0.0f;
static GLfloat sx=9.5f,sy= 9.5f,sz=5.0f;//太阳坐标
static GLfloat px=-4.0f,py= -3.0f,pz=0.0f;//人坐标
static GLfloat ex=0.0f,ey= 0.0f,ez=-8.0f;//人坐标
static GLfloat cx=0.0f,cy= 0.0f,cz=0.0f;
float theta = PI/2,phi = -PI/2;
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
static GLfloat zRot = 0.0f;
GLfloat red,green,blue;
GLint subMenu;
GLenum renderingMode=GL_SMOOTH;
GLuint g_texture = 0;
void init(void)
{
glClearColor(red,green,blue, 0.0);
}
void lighting()
{
// 定义太阳光源,它是一种白色的光源
GLfloat sun_light_position[] = { sx,sy,sz,1.0}; //光源的位置
GLfloat sun_light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};//环境光反射
GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};//漫反射
GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};//镜面反射
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);
glEnable(GL_LIGHT0);//打开光源
glEnable(GL_LIGHTING);//激活OpenGL光源
glEnable(GL_DEPTH_TEST);//打开深度测试
}
void sun()
{
// 定义太阳的材质并绘制太阳
GLfloat sun_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};//环境光反射
GLfloat sun_mat_diffuse[] = {0.0f, 0.0f, 0.0f, 1.0f};//漫反射
GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f}; //镜面反射
GLfloat sun_mat_emission[] = {1.0f, 1.0f, 0.0f, 1.0f}; //发射光颜色
GLfloat sun_mat_shininess = 0.0f; //镜面反射指数
glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);
glTranslatef(sx,sy,sz); //平移
glutSolidSphere(2.0, 40, 32);//绘制太阳
}
void table()
{
GLfloat mat_ambient[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat mat_shininess = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess);
glPushMatrix();
glTranslatef(0,-5,2);
//画出桌面:
glPushMatrix();
glScalef(5,.1,5);
glutSolidCube(1);
glColor3f(0.39,0.30,0.1);
glutWireCube(1);
glPopMatrix();
//绘制四个桌腿
glPushMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(2,-1,-2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(-2,-1,-2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(-2,-1,2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(2,-1,2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void goods()
{
//桌面上摆放物品,茶壶一只,立方体一个,球一个
glPushMatrix();
//茶壶
GLfloat mat_emission2[] = {0.2f, 0.2f, 0.2f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission2);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glTranslatef(0,-4.5,2);
glScalef(.6,1,.6);
glutSolidTeapot(.6);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();//立方体
GLfloat mat_emission3[] = {0.5f, 0.5f, 0.2f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.00,0.91,0.05,0.8);
glTranslatef(-1.3,-4.5,1.5);
glScalef(.6,1.0,2);
glutSolidCube(1);
glPopMatrix();
//球
GLfloat mat_emission4[] = {0.1f, 0.5f, 0.2f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(.8,-4.7,-0.3);
glRotatef(90,1,0,0);
glScalef(.5,.5,.5);
glutSolidSphere(.5,40,40);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
}
void car()
{
//绘制小车
GLfloat mat_ambient1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_diffuse1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_specular1[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat mat_shininess1 = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1);
glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess1);
//车上部
glPushMatrix();
glTranslatef(3+cx,-3+cy,2+cz);
glRotatef(cangle1,0,1,0);
glScalef(.5,.5,.5);
glPushMatrix();
glTranslatef(-1,0,-1);
glPushMatrix();
GLfloat mat_emission1[] = {1.0f, 0.3f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission1);
glTranslatef(2,-5,2);
glScalef(2,1,1.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
GLfloat mat_emission5[] = {1.0f, 0.2f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission5);
glTranslatef(2,-6,2);
// glRotatef(angle,0,1,0);
glScalef(4,1,1.5);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
//四个车轮
glPushMatrix();
GLfloat mat_emission2[] = {0.0f, 0.0f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission2);
glTranslatef(-1,0,-1);
glPushMatrix();
glTranslatef(0.8,-6.8,1.6);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPushMatrix();
glTranslatef(2.8,-6.8,1.6);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPushMatrix();
glTranslatef(0.8,-6.8,2.4);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPushMatrix();
glTranslatef(2.8,-6.8,2.4);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void people()
{
glPushMatrix();
GLfloat mat_ambient1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_diffuse1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_specular1[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat mat_shininess1 = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1);
glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess1);
GLfloat mat_emission1[] = {1.0, 0.9f, 0.2f, 1.0f};
GLfloat mat_emission2[] = {1.0, 1.0f, 0.1f, 1.0f};
GLfloat mat_emission3[] = {1.0, 0.7f, 0.1f, 1.0f};
GLfloat mat_emission4[] = {.5, 0.5f, 0.8f, 1.0f};
GLfloat mat_emission5[] = {0.0, 0.0f, 0.0f, 1.0f};
glTranslatef(px,py,pz);
glRotatef(pangle,0.0,1.0,0.0);
//头
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission1);
glTranslatef(0.0,1.5,0.0);
glScalef(10.0, 10.0, 10.0);
glutSolidSphere(0.04,40,40);
glPopMatrix();
//眼睛
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission5);
glTranslatef(0.2,1.6,-0.28);
glutSolidSphere(0.06,10,10);
glPopMatrix();
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission5);
glTranslatef(-0.2,1.6,-0.28);
glutSolidSphere(0.06,10,10);
glPopMatrix();
//身体
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission2);
glScalef(1.0,2.1,0.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glPushMatrix();
glTranslatef(0.0,1.0,0.0);
glRotatef(pangle6,1,0,0);
glRotatef(-pangle1,1,0,0);
glPushMatrix();
//左肢上
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(0.7,-0.5,0.0);
glScalef(0.2,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
//左肢下
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(0.0,-1.0,0.0);
glRotatef(-pangle2,1,0,0);
glTranslatef(0.7,0,0.0);
glRotatef(pangle5,1,0,0);
glTranslatef(0,-0.3,0.0);
glScalef(0.2,0.6,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,1.0,0.0);
glRotatef(pangle1,1,0,0);
//右肢上
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(-0.7,-0.5,0.0);
glScalef(0.2,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
//右肢下
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(0.0,-1.0,0.0);
glRotatef(pangle2,1,0,0);
glTranslatef(-0.7,-0.3,0.0);
glScalef(0.2,0.6,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glPushMatrix();
glTranslatef(0.0,-1.2,0.0);
glRotatef(pangle3,1,0,0);
//左腿上
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(0.2,-0.3,0.0);
glScalef(0.25,1.2,0.25);
glutSolidCube(1);
glPopMatrix();
//左腿下
glPushMatrix();
glTranslatef(0.0,-0.9,0.0);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glRotatef(pangle4,1,0,0);
glTranslatef(0.2,-0.5,0.0);
glScalef(0.25,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,-1.0,0.0);
glRotatef(-pangle3,1,0,0);
//右腿上
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(-0.2,-0.3,0.0);
glScalef(0.25,1.2,0.25);
glutSolidCube(1);
glPopMatrix();
//右腿下
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(0.0,-0.9,0.0);
glRotatef(pangle4,1,0,0);
glTranslatef(-0.2,-0.5,0.0);
glScalef(0.25,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void house()
{
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glColor3f(1.0,0.0,5.0);
glTranslatef(0.0,0.0,12.0);
glScalef(20,20,1);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(9,0.0,2);
glScalef(1,15,15);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(-9,0.0,2);
glScalef(1,15,15);
glutWireCube(1.0);
glPopMatrix();
}
void display()
{
//表示要清除颜色缓冲以及深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 创建透视效果视图
//GL_MODELVIEW 是模型矩阵GL_PROJECTION 是投影矩阵
glMatrixMode(GL_PROJECTION);
//glLoadIdentity该函数的功能是重置当前指定的矩阵为单位矩阵
glLoadIdentity();
//设置透视投影矩阵
gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);
//GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0);
lighting();
glPushMatrix();
sun();
glPopMatrix();
glPushMatrix();
people();
glPopMatrix();
glPushMatrix();
house();
car();
table();
goods();
glPopMatrix();
glPushMatrix();
glPopMatrix();
glutSwapBuffers();
}
void reshape(GLint w,GLint h)
{
// 设置视口大小
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
// 切换矩阵模式为投影矩阵
glMatrixMode(GL_PROJECTION);
// 载入单位矩阵
glLoadIdentity();
// 进行二维平行投影
gluPerspective(65, (GLfloat) w/h, 1.0, 1000); //设置投影矩阵
// 切换矩阵模式为模型矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); //变为单位矩阵
// 发送重绘
glutPostRedisplay();
}
void timefuncupdate(int value)
{
sx-=0.3f;
if(sx<-11.0f) sx=11.0f;
glutPostRedisplay();
glutTimerFunc(300,timefuncupdate,0);
}
void keyboard(unsigned char key, int x, int y)
{
display();
switch( key )
{
case 'a':
cangle1=0;
cx+=.1;
cangle+=10;
glutPostRedisplay();
break;
case 'b':
cangle1=0;
cx-=.1;
cangle-=10;
glutPostRedisplay();
break;
case 'c':
cangle1=90;
cz+=.05;
cangle+=10;
glutPostRedisplay();
break;
case 'd':
cz-=.05;
cangle1=90;
cangle-=10;
glutPostRedisplay();
break;
case 'p':
pangle+=10;
glutPostRedisplay();
break;
case 'o':
pz+=0.1;
px+=pz*tan(pangle);
pangle1+=5;
pangle2+=2;
pangle3+=3;
pangle4-=0.8;
if(pangle1>=50) pangle1=-50;
if(pangle2>=40)pangle2=0;
if(pangle3>=30)pangle3=-30;
if(pangle4<=-16)pangle4=0;
glutPostRedisplay();
break;
case 'l':
pangle6+=3;
if(pangle6==30)
pangle6=-30;
pangle5+=5;
if(pangle5==50)
pangle5=-50;
glutPostRedisplay();
break;
case 'x':
ex+=0.03;
glutPostRedisplay();
break;
case 'y':
ex-=0.03;
glutPostRedisplay();
break;
case 'z':
ez+=0.03;
glutPostRedisplay();
break;
case 's':
ex=0.0f;ey= 0.0f;ez=-8.0f;
glutPostRedisplay();
break;
case '1':
glutFullScreen();
glutPostRedisplay();
break;
case '2':
glutPositionWindow(100,100);
glutReshapeWindow(800,600);
break;
case 27: //关闭窗口
exit(0);
};
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP||key == GLUT_KEY_DOWN||key == GLUT_KEY_LEFT||key == GLUT_KEY_RIGHT)
{
pangle1+=1;
pangle2+=.4;
pangle3+=.6;
pangle4-=0.16;
if(pangle1>=50) pangle1=-50;
if(pangle2>=40)pangle2=0;
if(pangle3>=30)pangle3=-30;
if(pangle4<=-16)pangle4=0;
}
if(key == GLUT_KEY_UP)
{
py+= 0.05f;
pz+= 0.05f;
pangle=180;
}
if(key == GLUT_KEY_DOWN)
{
py-= 0.05f;
pz-= 0.05f;
pangle=0;
}
if(key == GLUT_KEY_LEFT)
{
px += 0.05f;
pangle=-90;
}
if(key == GLUT_KEY_RIGHT)
{
px -= 0.05f;
pangle=90;
}
}
//创建主菜单项
void mainMenu(GLint renderingOption)
{
switch(renderingOption)
{
case 1:renderingMode=GL_FLAT;break;
case 2:renderingMode=GL_SMOOTH;break;
}
glutPostRedisplay();
}
//创建子菜单项
void SubMenu(GLint option)
{
switch(option)
{
case 1:
red=0.0;green=0.0;blue=1.0;
break;
case 2:
red=0.0;green=1.0;blue=0.0;
break;
case 3:
red=1.0;green=1.0;blue=1.0;
break;
}
glClearColor(red,green,blue, 0.0);
glutPostRedisplay();
}
void output()
{
cout<<"-----------------------------场景功能快捷键说明-----------------------------"<<endl<<endl;
cout<<" 我所绘制的场景包括三堵墙,一张桌子及桌上物品,一辆小车,一个人以及随时间运动的光源太阳。"<<endl;
cout<<"该场景所实现的功能及所用到的快捷键如下如下:"<<endl<<endl;
cout<<"1、关于小车:"<<endl;
cout<<"(1)a----小车旋转并向左行驶"<<endl;
cout<<"(2)b----小车旋转并向右行驶"<<endl;
cout<<"(3)c----小车向前行驶"<<endl;
cout<<"(4)d----小车向后行驶"<<endl<<endl;
cout<<"2、关于小人:"<<endl;
cout<<"(1)左键----小人旋转并向左走"<<endl;
cout<<"(2)右键----小人旋转并向右走"<<endl;
cout<<"(3)上键----小人旋转并向后走"<<endl;
cout<<"(4)下键----小人旋转并向前走"<<endl;
cout<<"(5)l----小人左胳膊做前后摇摆运动"<<endl;
cout<<"(6)p----长按旋转至任意方向"<<endl;
cout<<"(7)o----沿任意方向行走"<<endl<<endl;
cout<<"3、关于视角(人眼位置):"<<endl;
cout<<"(1)x----人眼向左移动,即场景向右旋转"<<endl;
cout<<"(2)y----人眼向右移动,即场景向左旋转"<<endl;
cout<<"(3)z----人眼向靠近场景的方向移动,即场景向前移动"<<endl;
cout<<"(4)s----复原场景至最初界面"<<endl<<endl;
cout<<"4、关于下拉菜单:"<<endl;
cout<<"在场景中任意点点击鼠标右键,会弹出下拉菜单,选择颜色的任意一种,即可改变背景颜色。"<<endl<<endl;
cout<<"5、关于窗口:"<<endl;
cout<<"(1)1----窗口进入全屏模式"<<endl;
cout<<"(2)2----窗口复原至初始状态"<<endl;
cout<<"(3)Esc----关闭窗口"<<endl;
}
void main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowPosition(500,100);
glutInitWindowSize(WIDTH,HEIGHT);
glutCreateWindow("计算机图形学");
init();
glutKeyboardFunc(keyboard);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(display);
glutTimerFunc(2,timefuncupdate,0);
glutReshapeFunc(reshape);
subMenu = glutCreateMenu(SubMenu);
glutAddMenuEntry("Blue",1);
glutAddMenuEntry("Green",2);
glutAddMenuEntry("White",3);
glutCreateMenu(mainMenu);
glutAddMenuEntry("Solid-Color Fill",1);
glutAddMenuEntry("Color-rpolation Fill",2);
glutAddSubMenu("Color",subMenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
output();
glutMainLoop();
}
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include<windows.h>
//#include <glaux.h>
#include<iostream.h>
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#define PI 3.14159265358979323846f
#define WIDTH 800
#define HEIGHT 600
#define MAX_CHAR 128
static GLfloat angle=0.0f,cangle=0.0f,cangle1=90.0f,pangle=0.0f,pangle1=0.0f,pangle2=0.0f,pangle3=0.0f,pangle4=0.0f,pangle5=0.0f,pangle6=0.0f;
static GLfloat sx=9.5f,sy= 9.5f,sz=5.0f;//太阳坐标
static GLfloat px=-4.0f,py= -3.0f,pz=0.0f;//人坐标
static GLfloat ex=0.0f,ey= 0.0f,ez=-8.0f;//人坐标
static GLfloat cx=0.0f,cy= 0.0f,cz=0.0f;
float theta = PI/2,phi = -PI/2;
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
static GLfloat zRot = 0.0f;
GLfloat red,green,blue;
GLint subMenu;
GLenum renderingMode=GL_SMOOTH;
GLuint g_texture = 0;
void init(void)
{
glClearColor(red,green,blue, 0.0);
}
void lighting()
{
// 定义太阳光源,它是一种白色的光源
GLfloat sun_light_position[] = { sx,sy,sz,1.0}; //光源的位置
GLfloat sun_light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};//环境光反射
GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};//漫反射
GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};//镜面反射
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);
glEnable(GL_LIGHT0);//打开光源
glEnable(GL_LIGHTING);//激活OpenGL光源
glEnable(GL_DEPTH_TEST);//打开深度测试
}
void sun()
{
// 定义太阳的材质并绘制太阳
GLfloat sun_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};//环境光反射
GLfloat sun_mat_diffuse[] = {0.0f, 0.0f, 0.0f, 1.0f};//漫反射
GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f}; //镜面反射
GLfloat sun_mat_emission[] = {1.0f, 1.0f, 0.0f, 1.0f}; //发射光颜色
GLfloat sun_mat_shininess = 0.0f; //镜面反射指数
glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);
glTranslatef(sx,sy,sz); //平移
glutSolidSphere(2.0, 40, 32);//绘制太阳
}
void table()
{
GLfloat mat_ambient[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat mat_shininess = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess);
glPushMatrix();
glTranslatef(0,-5,2);
//画出桌面:
glPushMatrix();
glScalef(5,.1,5);
glutSolidCube(1);
glColor3f(0.39,0.30,0.1);
glutWireCube(1);
glPopMatrix();
//绘制四个桌腿
glPushMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(2,-1,-2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(-2,-1,-2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(-2,-1,2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.0,0.05,0.0,0.0);
glTranslatef(2,-1,2);
glScalef(.1,2,.1);
glutSolidCube(1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void goods()
{
//桌面上摆放物品,茶壶一只,立方体一个,球一个
glPushMatrix();
//茶壶
GLfloat mat_emission2[] = {0.2f, 0.2f, 0.2f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission2);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glTranslatef(0,-4.5,2);
glScalef(.6,1,.6);
glutSolidTeapot(.6);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();//立方体
GLfloat mat_emission3[] = {0.5f, 0.5f, 0.2f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glColorMaterial(GL_FRONT,GL_AMBIENT);
glColor4f(1.00,0.91,0.05,0.8);
glTranslatef(-1.3,-4.5,1.5);
glScalef(.6,1.0,2);
glutSolidCube(1);
glPopMatrix();
//球
GLfloat mat_emission4[] = {0.1f, 0.5f, 0.2f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(.8,-4.7,-0.3);
glRotatef(90,1,0,0);
glScalef(.5,.5,.5);
glutSolidSphere(.5,40,40);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
}
void car()
{
//绘制小车
GLfloat mat_ambient1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_diffuse1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_specular1[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat mat_shininess1 = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1);
glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess1);
//车上部
glPushMatrix();
glTranslatef(3+cx,-3+cy,2+cz);
glRotatef(cangle1,0,1,0);
glScalef(.5,.5,.5);
glPushMatrix();
glTranslatef(-1,0,-1);
glPushMatrix();
GLfloat mat_emission1[] = {1.0f, 0.3f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission1);
glTranslatef(2,-5,2);
glScalef(2,1,1.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
GLfloat mat_emission5[] = {1.0f, 0.2f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission5);
glTranslatef(2,-6,2);
// glRotatef(angle,0,1,0);
glScalef(4,1,1.5);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
//四个车轮
glPushMatrix();
GLfloat mat_emission2[] = {0.0f, 0.0f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission2);
glTranslatef(-1,0,-1);
glPushMatrix();
glTranslatef(0.8,-6.8,1.6);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPushMatrix();
glTranslatef(2.8,-6.8,1.6);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPushMatrix();
glTranslatef(0.8,-6.8,2.4);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPushMatrix();
glTranslatef(2.8,-6.8,2.4);
glRotatef(cangle,0,0,1);
glutSolidTorus(.2,.6,5,100);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void people()
{
glPushMatrix();
GLfloat mat_ambient1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_diffuse1[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat mat_specular1[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat mat_shininess1 = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1);
glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess1);
GLfloat mat_emission1[] = {1.0, 0.9f, 0.2f, 1.0f};
GLfloat mat_emission2[] = {1.0, 1.0f, 0.1f, 1.0f};
GLfloat mat_emission3[] = {1.0, 0.7f, 0.1f, 1.0f};
GLfloat mat_emission4[] = {.5, 0.5f, 0.8f, 1.0f};
GLfloat mat_emission5[] = {0.0, 0.0f, 0.0f, 1.0f};
glTranslatef(px,py,pz);
glRotatef(pangle,0.0,1.0,0.0);
//头
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission1);
glTranslatef(0.0,1.5,0.0);
glScalef(10.0, 10.0, 10.0);
glutSolidSphere(0.04,40,40);
glPopMatrix();
//眼睛
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission5);
glTranslatef(0.2,1.6,-0.28);
glutSolidSphere(0.06,10,10);
glPopMatrix();
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission5);
glTranslatef(-0.2,1.6,-0.28);
glutSolidSphere(0.06,10,10);
glPopMatrix();
//身体
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission2);
glScalef(1.0,2.1,0.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glPushMatrix();
glTranslatef(0.0,1.0,0.0);
glRotatef(pangle6,1,0,0);
glRotatef(-pangle1,1,0,0);
glPushMatrix();
//左肢上
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(0.7,-0.5,0.0);
glScalef(0.2,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
//左肢下
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(0.0,-1.0,0.0);
glRotatef(-pangle2,1,0,0);
glTranslatef(0.7,0,0.0);
glRotatef(pangle5,1,0,0);
glTranslatef(0,-0.3,0.0);
glScalef(0.2,0.6,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,1.0,0.0);
glRotatef(pangle1,1,0,0);
//右肢上
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(-0.7,-0.5,0.0);
glScalef(0.2,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
//右肢下
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(0.0,-1.0,0.0);
glRotatef(pangle2,1,0,0);
glTranslatef(-0.7,-0.3,0.0);
glScalef(0.2,0.6,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glPushMatrix();
glTranslatef(0.0,-1.2,0.0);
glRotatef(pangle3,1,0,0);
//左腿上
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(0.2,-0.3,0.0);
glScalef(0.25,1.2,0.25);
glutSolidCube(1);
glPopMatrix();
//左腿下
glPushMatrix();
glTranslatef(0.0,-0.9,0.0);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glRotatef(pangle4,1,0,0);
glTranslatef(0.2,-0.5,0.0);
glScalef(0.25,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,-1.0,0.0);
glRotatef(-pangle3,1,0,0);
//右腿上
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);
glTranslatef(-0.2,-0.3,0.0);
glScalef(0.25,1.2,0.25);
glutSolidCube(1);
glPopMatrix();
//右腿下
glPushMatrix();
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);
glTranslatef(0.0,-0.9,0.0);
glRotatef(pangle4,1,0,0);
glTranslatef(-0.2,-0.5,0.0);
glScalef(0.25,1.0,0.25);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void house()
{
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glColor3f(1.0,0.0,5.0);
glTranslatef(0.0,0.0,12.0);
glScalef(20,20,1);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(9,0.0,2);
glScalef(1,15,15);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(-9,0.0,2);
glScalef(1,15,15);
glutWireCube(1.0);
glPopMatrix();
}
void display()
{
//表示要清除颜色缓冲以及深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 创建透视效果视图
//GL_MODELVIEW 是模型矩阵GL_PROJECTION 是投影矩阵
glMatrixMode(GL_PROJECTION);
//glLoadIdentity该函数的功能是重置当前指定的矩阵为单位矩阵
glLoadIdentity();
//设置透视投影矩阵
gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);
//GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0);
lighting();
glPushMatrix();
sun();
glPopMatrix();
glPushMatrix();
people();
glPopMatrix();
glPushMatrix();
house();
car();
table();
goods();
glPopMatrix();
glPushMatrix();
glPopMatrix();
glutSwapBuffers();
}
void reshape(GLint w,GLint h)
{
// 设置视口大小
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
// 切换矩阵模式为投影矩阵
glMatrixMode(GL_PROJECTION);
// 载入单位矩阵
glLoadIdentity();
// 进行二维平行投影
gluPerspective(65, (GLfloat) w/h, 1.0, 1000); //设置投影矩阵
// 切换矩阵模式为模型矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); //变为单位矩阵
// 发送重绘
glutPostRedisplay();
}
void timefuncupdate(int value)
{
sx-=0.3f;
if(sx<-11.0f) sx=11.0f;
glutPostRedisplay();
glutTimerFunc(300,timefuncupdate,0);
}
void keyboard(unsigned char key, int x, int y)
{
display();
switch( key )
{
case 'a':
cangle1=0;
cx+=.1;
cangle+=10;
glutPostRedisplay();
break;
case 'b':
cangle1=0;
cx-=.1;
cangle-=10;
glutPostRedisplay();
break;
case 'c':
cangle1=90;
cz+=.05;
cangle+=10;
glutPostRedisplay();
break;
case 'd':
cz-=.05;
cangle1=90;
cangle-=10;
glutPostRedisplay();
break;
case 'p':
pangle+=10;
glutPostRedisplay();
break;
case 'o':
pz+=0.1;
px+=pz*tan(pangle);
pangle1+=5;
pangle2+=2;
pangle3+=3;
pangle4-=0.8;
if(pangle1>=50) pangle1=-50;
if(pangle2>=40)pangle2=0;
if(pangle3>=30)pangle3=-30;
if(pangle4<=-16)pangle4=0;
glutPostRedisplay();
break;
case 'l':
pangle6+=3;
if(pangle6==30)
pangle6=-30;
pangle5+=5;
if(pangle5==50)
pangle5=-50;
glutPostRedisplay();
break;
case 'x':
ex+=0.03;
glutPostRedisplay();
break;
case 'y':
ex-=0.03;
glutPostRedisplay();
break;
case 'z':
ez+=0.03;
glutPostRedisplay();
break;
case 's':
ex=0.0f;ey= 0.0f;ez=-8.0f;
glutPostRedisplay();
break;
case '1':
glutFullScreen();
glutPostRedisplay();
break;
case '2':
glutPositionWindow(100,100);
glutReshapeWindow(800,600);
break;
case 27: //关闭窗口
exit(0);
};
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP||key == GLUT_KEY_DOWN||key == GLUT_KEY_LEFT||key == GLUT_KEY_RIGHT)
{
pangle1+=1;
pangle2+=.4;
pangle3+=.6;
pangle4-=0.16;
if(pangle1>=50) pangle1=-50;
if(pangle2>=40)pangle2=0;
if(pangle3>=30)pangle3=-30;
if(pangle4<=-16)pangle4=0;
}
if(key == GLUT_KEY_UP)
{
py+= 0.05f;
pz+= 0.05f;
pangle=180;
}
if(key == GLUT_KEY_DOWN)
{
py-= 0.05f;
pz-= 0.05f;
pangle=0;
}
if(key == GLUT_KEY_LEFT)
{
px += 0.05f;
pangle=-90;
}
if(key == GLUT_KEY_RIGHT)
{
px -= 0.05f;
pangle=90;
}
}
//创建主菜单项
void mainMenu(GLint renderingOption)
{
switch(renderingOption)
{
case 1:renderingMode=GL_FLAT;break;
case 2:renderingMode=GL_SMOOTH;break;
}
glutPostRedisplay();
}
//创建子菜单项
void SubMenu(GLint option)
{
switch(option)
{
case 1:
red=0.0;green=0.0;blue=1.0;
break;
case 2:
red=0.0;green=1.0;blue=0.0;
break;
case 3:
red=1.0;green=1.0;blue=1.0;
break;
}
glClearColor(red,green,blue, 0.0);
glutPostRedisplay();
}
void output()
{
cout<<"-----------------------------场景功能快捷键说明-----------------------------"<<endl<<endl;
cout<<" 我所绘制的场景包括三堵墙,一张桌子及桌上物品,一辆小车,一个人以及随时间运动的光源太阳。"<<endl;
cout<<"该场景所实现的功能及所用到的快捷键如下如下:"<<endl<<endl;
cout<<"1、关于小车:"<<endl;
cout<<"(1)a----小车旋转并向左行驶"<<endl;
cout<<"(2)b----小车旋转并向右行驶"<<endl;
cout<<"(3)c----小车向前行驶"<<endl;
cout<<"(4)d----小车向后行驶"<<endl<<endl;
cout<<"2、关于小人:"<<endl;
cout<<"(1)左键----小人旋转并向左走"<<endl;
cout<<"(2)右键----小人旋转并向右走"<<endl;
cout<<"(3)上键----小人旋转并向后走"<<endl;
cout<<"(4)下键----小人旋转并向前走"<<endl;
cout<<"(5)l----小人左胳膊做前后摇摆运动"<<endl;
cout<<"(6)p----长按旋转至任意方向"<<endl;
cout<<"(7)o----沿任意方向行走"<<endl<<endl;
cout<<"3、关于视角(人眼位置):"<<endl;
cout<<"(1)x----人眼向左移动,即场景向右旋转"<<endl;
cout<<"(2)y----人眼向右移动,即场景向左旋转"<<endl;
cout<<"(3)z----人眼向靠近场景的方向移动,即场景向前移动"<<endl;
cout<<"(4)s----复原场景至最初界面"<<endl<<endl;
cout<<"4、关于下拉菜单:"<<endl;
cout<<"在场景中任意点点击鼠标右键,会弹出下拉菜单,选择颜色的任意一种,即可改变背景颜色。"<<endl<<endl;
cout<<"5、关于窗口:"<<endl;
cout<<"(1)1----窗口进入全屏模式"<<endl;
cout<<"(2)2----窗口复原至初始状态"<<endl;
cout<<"(3)Esc----关闭窗口"<<endl;
}
void main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowPosition(500,100);
glutInitWindowSize(WIDTH,HEIGHT);
glutCreateWindow("计算机图形学");
init();
glutKeyboardFunc(keyboard);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(display);
glutTimerFunc(2,timefuncupdate,0);
glutReshapeFunc(reshape);
subMenu = glutCreateMenu(SubMenu);
glutAddMenuEntry("Blue",1);
glutAddMenuEntry("Green",2);
glutAddMenuEntry("White",3);
glutCreateMenu(mainMenu);
glutAddMenuEntry("Solid-Color Fill",1);
glutAddMenuEntry("Color-rpolation Fill",2);
glutAddSubMenu("Color",subMenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
output();
glutMainLoop();
}
相关文章推荐
- 软考六:网络与多媒体基础知识
- [Unity热更新]tolua# & LuaFramework(六):网络通信
- 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)
- 网络编程学习——套接字编程(一)
- HttpClient使用详解
- 在内部网络为edX配置视频服务
- 使用restful请求https身份不通过, unable to find valid certification path to requested target,使用java生成签名证书
- 博客专题计划:《在实践中深入理解常见网络协议》
- 数据结构--二叉树的线索化
- [转] 考拉BP神经网络的matlab实现学习历程(三)
- 【数据结构】FibonacciHeap 斐波那契堆(更新时间:2016-04-07)
- 计划任务
- 七牛云上传图片 NoClassDedFoundError:com.squareup.okhttp.OkHttpClient异常
- js--数据结构--树
- HTTPS工作原理
- 网站性能优化之开启服务器端http压缩
- hdu5294(最大流+最短路)Tricks Device
- TCP三次握手四次挥手过程
- matlab的几种边缘检测算子的比较分析http://www.kongzhi.net/cases/caseview.php?id=2368
- 【计算机视觉】time of flight (TOF)