您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 计算机图形学实验报告
学生实验实习报告册学年学期:2016-2017学年春□√秋学期课程名称:大学计算机基础学生学院:通信与信息工程学院专业班级:学生学号:学生姓名:联系电话:重庆邮电大学教务处印制实验实习名OpenGL基本使用指导教师秦红星考核成绩课程名称计算机图形学A课程编号040659实验实习地点信息科技大厦S306完成日期2016年10月17日学生姓名学生学号学院专业广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求目的:认识了解OpenGL的性质、功能要求:1.利用OpenGL绘制一个简单的场景:比如球体、正方体2.加入灯光3.实现交互操作:平移、缩放、旋转二、实验实习设备(环境)及要求(软硬件条件)采用MicrosoftVisualC2010生成环境并用C++编写程序三、实验实习内容与步骤内容:背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。步骤:建立立体--添加光照--添加变换1.先写“主函数”,在主函数中将窗口生成好。2.在“自定义函数1”中对窗口进行清除、填色等操作。3.在“自定义函数1”中设置点光源,设置光照的各种参数。4.在“自定义函数1”中设置平移、缩放、旋转及各参数。5.在“自定义函数2”中设置平移和缩放的循环。6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。实现动画。四、实验实习过程或算法(源程序、代码)#includeGL/glut.hGLfloatangle=0.0f;GLfloatmultiply=0.0f;voiddisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glClearColor(0.0f,0.0f,0.0f,0.0f);//设置窗口里面的背景颜色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f,1.0f,1.0f,20.0f);glLoadIdentity();gluLookAt(0.5,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0);{//设置一个点光源GLfloatlight_position[]={0.5f,0.0f,0.0f,1.0f};//(xyzw)w为1时代表点光源,0时代表方向光源GLfloatlight_ambient[]={0.5f,0.5f,0.5f,1.0f};//(0001)GLfloatlight_diffuse[]={1.0f,1.0f,1.0f,1.0f};//(1111)GLfloatlight_specular[]={1.0f,1.0f,1.0f,1.0f};//(1111)glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);//光源环境光强值glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//光源漫反射强值glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);//光源镜面反射强值glEnable(GL_LIGHT0);//打开该光源glEnable(GL_LIGHTING);//打开光照}{glRotatef(angle,0.0f,1.0f,0.0f);glTranslatef(0.0f,0.0f,0.6f);//平移glScaled(multiply,multiply,multiply);//缩放glutSolidSphere(0.2,50,50);}glutSwapBuffers();}voidrotateAndzoom(void)//旋转和缩放{angle+=1.0f;if(angle=360.0f)angle=0.0f;display();//设置旋转multiply+=0.01f;if(multiply=2.0f)//multiply-=0.01f;//if(multiply=1.0f)multiply=1.0f;display();//设置缩放}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);glutInitWindowPosition(400,50);glutInitWindowSize(800,800);glutCreateWindow(立体);glutDisplayFunc(&display);glutIdleFunc(&rotateAndzoom);//旋转glutMainLoop();//调用该函数启动程序,所有以创建的窗口将会显示return0;}五、实验实习结果分析和(或)源程序调试过程实验实习名直线扫面和区域填充实现指导教师秦红星考核成绩课程名称计算机图形学A课程编号040659实验实习地点信息科技大厦S306完成日期2016年11月10日学生姓名学生学号学院专业广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求项目目的:熟悉光栅图形学中的相关算法项目要求:1.应用OpenGL点绘制函数直线与区域2.采用直线扫面算法绘制一条线段,直线有离散点组成3.利用区域填充算法绘制多边形区域,区域由离散点组成二、实验实习设备(环境)及要求(软硬件条件)采用MicrosoftVisualC2010生成环境并用C++编写程序三、实验实习内容与步骤内容:1.用DDA算法实现点绘制直线。2.用直线扫描法填充绘制绿色的六边形。步骤:点绘制直线:1.选定用利用DDA算法。2.完善相应计算点的算法代码,利用该代码算出直线上所有的点。3.用OpenGL函数将点连接起来形成直线绘制直线。区域填充:1.初始化一个空的栈用于存放种子点,将种子点(x,y)入栈;2.判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x,y),y是当前的扫描线;3.从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight;4.分别检查与当前扫描线相邻的y-1和y+1两条扫描线在区间[xLeft,xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第(2)步;四、实验实习过程或算法(源程序、代码)1.“点绘制直线”的代码:#includeGL/glut.h#includestdlib.hvoidinit(void){glClearColor(0.0,0.0,0.0,0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,500.0,0.0,500.0);glMatrixMode(GL_MODELVIEW);}voiddrawpixel(intx,inty,intz)//此为一个画点的函数{glBegin(GL_POINTS);glViewport(0,0,500,500);//指定在窗口中的位置。0,0为左下角窗口的位置,500,500为宽度和高度glVertex3d(x,y,0);glEnd();glFlush();}voidDDALine(intx0,inty0,intx1,inty1){intx;GLfloatNx,Ny,y;//x,y的点的个数intdx,dy,quantity;//dx是x0-x1的x的总增量,dy是y0-y1的y的总增量,quantity为点的数量floatk;dx=x1-x0;dy=y1-y0;k=dy/dx;if(abs(dx)abs(dy))//通过绝对值判断谁为先变{quantity=abs(dx);}else{quantity=abs(dy);}Nx=(GLfloat)dx/(GLfloat)quantity;//x方向上的单位增量Ny=(GLfloat)dy/(GLfloat)quantity;//y方向上的单位增量for(x=x0,y=y0;x=x1;x++){x=int(x+Nx);y=y+Ny;drawpixel(x,int(y+0.5),0);}}voiddisplay(void)//生成直线的函数{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);//红色DDALine(100,150,300,100);glFlush();}voidmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutCreateWindow(项目2);init();glutDisplayFunc(display);glutMainLoop();}2.“区域填充”的代码:#includegl/glut.h#includewindows.hconstintPOINTNUM=6;//多边形点数.//定义结构体用于活性边表AET和新边表NETtypedefstructXET{floatx;floatdx,ymax;XET*next;}AET,NET;//定义点结构体pointstructpoint{floatx;floaty;}polypoint[POINTNUM]={250,50,500,150,550,400,400,250,200,350,100,100};//多边形顶点voidPolyScan(){//计算最高点的y坐标(扫描到此结束)intMaxY=0;inti;for(i=0;iPOINTNUM;i++)if(polypoint[i].yMaxY)MaxY=polypoint[i].y;//初始化AET表AET*pAET=newAET;pAET-next=NULL;//初始化NET表NET*pNET[1024];for(i=0;i=MaxY;i++){pNET[i]=newNET;pNET[i]-next=NULL;}glClear(GL_COLOR_BUFFER_BIT);//赋值的窗口显示.glColor3f(0.5,0.5,0.0);//设置直线的颜色红色glBegin(GL_POINTS);//扫描并建立NET表for(i=0;i=MaxY;i++){for(intj=0;jPOINTNUM;j++)if(polypoint[j].y==i){//一个点跟前面的一个点形成一条线段,跟后面的点也形成线段if(polypoint[(j-1+POINTNUM)%POINTNUM].ypolypoint[j].y){NET*p=newNET;p-x=polypoint[j].x;p-ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y;p-dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y);p-next=pNET[i]-next;pNET[i]-next=p;}if(polypoint[(j+1+POINTNUM)%POINTNUM].ypolypoint[j].y){NET*p=newNET;p-x=polypoint[j].x;p-
本文标题:计算机图形学实验报告
链接地址:https://www.777doc.com/doc-4307144 .html