当前位置:文档之家› 计算机图形学实验报告记录

计算机图形学实验报告记录

计算机图形学实验报告记录————————————————————————————————作者:————————————————————————————————日期:计算机图形学实验报告姓名:___ __________学号:_____ ________班级:______ _______时间:_____2016年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。

学会配置OpenGL环境,并在该环境中编程绘图。

2.实验内容OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。

OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。

当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。

OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut、Windows 专用库:wgl。

OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。

了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。

3.实验代码及结果3.1点的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glPointSize(10); //三个点glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.2直线的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_LINE_LOOP); //五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.3多边形面的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_TRIANGLES); //等边三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。

2.实验内容(一)数值微分法数值微分法直接从直线的微分方程生成直线。

给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),得到直线的微分方程dy/dx=△y/△x=(Y1-Y0)/(X1-X0)=k。

数值微分算法的原理是,由于直线的一阶导数是连续的,而且△x和△y是成比例的,因此通过在当前位置(Xi,Yi)分别加上两个小增量ε△x和ε△y(ε为无穷小的正数)来求下一点(X(i+1),Y(i+1))的x,y坐标。

(二)中点画线算法给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),可得到直线方程F(x,y)=y-kx-b=0且k=△y/△x=(Y1-Y0)/(X1-X0)。

绘图过程如下:○1.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。

○2.计算初始值△x, △y,d=△x-2△y,x=X0,y=Y0.○3.绘制点(x,y)。

判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。

○4.当直线没有画完时,重复步骤○3,否则结束。

(三)Bresenham算法算法步骤如下:○1.输入直线两端点P0(X0,Y0)和P1(X1,Y1)。

○2.计算初始值△x, △y,e=-△x,x=X0,y=Y0。

○3.绘制点(x,y)。

○4.e更新为e+2△y。

判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同样将e更新为e-2△x;否则(x,y)更新为(x+1,y)。

○5.当直线没有画完时,重复步骤○3和○4;否则结束。

3.实验代码及结果3.1数值微分算法编程绘制直线代码:#include<gl/glut.h>#include<windows.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色glBegin(GL_LINES);int x0=10;int y0=20;int x1=30;int y1=40;int color=10;int dx,dy,epsl,k;float x,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0; //if(abs(dx)>abs(dy))epsl=abs(dx);else epsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){glVertex2i(int(x+0.5),(int)(y+0.5));x+=xIncre;y+=yIncre;}glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}实验结果:2.2中点画线算法编程绘制直线代码:#include<gl/glut.h>#include<windows.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色glBegin(GL_POINTS);int x0=50;int y0=20;int x1=100;int y1=120;int color=10;int dx,dy,d,UpIncre,DownIncre,x,y;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy; DownIncre=2*dy;while(x<=x1){glVertex2i(x,y);x++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;}glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}实验结果:2.3Bresenham算法编程绘制直线代码:#include <gl/glut.h>#include <windows.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色//Bresenham算法glBegin(GL_POINTS);int x0 = 10;int y0 = 20;int x1 = 90;int y1 = 90;int color=10;int x,y,dx,dy,e;dx = x1-x0;dy = y1-y0;e=-dx;x=x0;y=y0;while(x<=x1){glVertex2i(x,y);x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的现实模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,200); //设置窗口的位置glutCreateWindow("点"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示函数Initial(); //完成窗口的初始化glutMainLoop(); //启动主GLUT事件处理循环return 0;}实验结果:实验三圆绘制实验1.实验目的2.实验内容(一)八分法画圆圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。

相关主题