计算机图形学实验报告.docx
- 文档编号:7200077
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:46
- 大小:123.35KB
计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(46页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
计算机图形学实验报告
姓名:
_____________
学号:
_____________
班级:
_____________
时间:
_____2016年12月_________
实验一OpenGL编程与图形绘制
1.实验目的
了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。
学会配置OpenGL环境,并在该环境中编程绘图。
2.实验内容
OpenGL的主要功能:
模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。
OpenGL的绘制流程分为两个方面:
一个完整的窗口系统的OpenGL图形处理系统的结构为:
最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。
当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。
OpenGL的基本语法中相关库有:
OpenGL核心库:
gl、OpenGL实用程序库:
glu、OpenG编程辅助库:
aux、OpenGL实用程序工具包(OpenGLutilitytoolkit,GLUT):
glut、Windows专用库:
wgl。
OpenGL的基本语法中命名规则为:
OpenGL函数都遵循一个命名约定,即采用以下格式:
<库前缀><根命令〉〈可选的参数个数><可选的参数类型〉。
了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。
3.实验代码及结果
3。
1点的绘制:
#include〈gl/glut。
h>
voidInitial(void)
{
glClearColor(1.0f,1.0f,1。
0f,1.0f);//设置窗口背景颜色为白色
glMatrixMode(GL_PROJECTION);//指定设置投影参数
gluOrtho2D(0。
0,200.0,0.0,150.0);//设置投影参数
}
voidDisplay(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程序
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式
glutInitWindowSize(400,300);//设置窗口的尺寸
glutInitWindowPosition(100,120);//设置窗口位置
glutCreateWindow("矩形”);//创建一个名为矩形的窗口
glutDisplayFunc(Display);//设置当前窗口的显示回调函数
Initial();//完成窗口初始化
glutMainLoop();//完成窗口GLUT事件处理循环
return0;
}
运行结果:
3。
2直线的绘制:
#include〈gl/glut。
h〉
voidInitial(void)
{
glClearColor(1。
0f,1。
0f,1。
0f,1。
0f);//设置窗口背景颜色为白色
glMatrixMode(GL_PROJECTION);//指定设置投影参数
gluOrtho2D(0。
0,200.0,0.0,150.0);//设置投影参数
}
voidDisplay(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程序
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式
glutInitWindowSize(400,300);//设置窗口的尺寸
glutInitWindowPosition(100,120);//设置窗口位置
glutCreateWindow("矩形");//创建一个名为矩形的窗口
glutDisplayFunc(Display);//设置当前窗口的显示回调函数
Initial();//完成窗口初始化
glutMainLoop();//完成窗口GLUT事件处理循环
return0;
}
运行结果:
3.3多边形面的绘制:
#include〈gl/glut。
h>
voidInitial(void)
{
glClearColor(1。
0f,1。
0f,1.0f,1。
0f);//设置窗口背景颜色为白色
glMatrixMode(GL_PROJECTION);//指定设置投影参数
gluOrtho2D(0.0,200.0,0。
0,150.0);//设置投影参数
}
voidDisplay(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程序
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式
glutInitWindowSize(400,300);//设置窗口的尺寸
glutInitWindowPosition(100,120);//设置窗口位置
glutCreateWindow("矩形”);//创建一个名为矩形的窗口
glutDisplayFunc(Display);//设置当前窗口的显示回调函数
Initial();//完成窗口初始化
glutMainLoop();//完成窗口GLUT事件处理循环
return0;
}
运行结果:
实验二直线绘制实验
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)。
绘图过程如下:
.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。
.计算初始值△x,△y,d=△x-2△y,x=X0,y=Y0。
。
绘制点(x,y)。
判断d的符号,若d〈0,则(x,y)更新为(x+1,y+1),d更新为d+2△x—2△y;否则(x,y)更新为(x+1,y),d更新为△y.
.当直线没有画完时,重复步骤
否则结束。
(三)Bresenham算法
算法步骤如下:
.输入直线两端点P0(X0,Y0)和P1(X1,Y1).
.计算初始值△x,△y,e=-△x,x=X0,y=Y0。
.绘制点(x,y)。
.e更新为e+2△y.判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同样将e更新为e—2△x;否则(x,y)更新为(x+1,y)。
.当直线没有画完时,重复步骤
和
;否则结束。
3.实验代码及结果
3.1数值微分算法编程绘制直线代码:
#include h> #include〈windows.h〉 voidInitial(void) { glClearColor(1。 0f,1.0f,1。 0f,1.0f);//设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION);//指定设置投影参数 gluOrtho2D(0.0,200。 0,0.0,150.0);//设置投影参数 } voidDisplay(void) { glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口 glColor3f(1。 0f,0.0f,0。 0f);//设置当前的绘图颜色为红色 glBegin(GL_LINES); intx0=10;inty0=20;intx1=30;inty1=40;intcolor=10; intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0;// if(abs(dx)>abs(dy)) epsl=abs(dx); elseepsl=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程序 } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式 glutInitWindowSize(400,300);//设置窗口的尺寸 glutInitWindowPosition(100,120);//设置窗口位置 glutCreateWindow(”矩形”);//创建一个名为矩形的窗口 glutDisplayFunc(Display);//设置当前窗口的显示回调函数 Initial();//完成窗口初始化 glutMainLoop();//完成窗口GLUT事件处理循环 return0; } 实验结果: 2.2中点画线算法编程绘制直线代码: #include h> #include〈windows。 h〉 voidInitial(void) { glClearColor(1.0f,1.0f,1。 0f,1.0f);//设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION);//指定设置投影参数 gluOrtho2D(0。 0,200。 0,0。 0,150.0);//设置投影参数 } voidDisplay(void) { glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口 glColor3f(1。 0f,0.0f,0。 0f);//设置当前的绘图颜色为红色 glBegin(GL_POINTS); intx0=50;inty0=20;intx1=100;inty1=120;intcolor=10; intdx,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; } elsed+=DownIncre; } glEnd(); glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序 } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式 glutInitWindowSize(400,300);//设置窗口的尺寸 glutInitWindowPosition(100,120);//设置窗口位置 glutCreateWindow(”矩形”);//创建一个名为矩形的窗口 glutDisplayFunc(Display);//设置当前窗口的显示回调函数 Initial();//完成窗口初始化 glutMainLoop();//完成窗口GLUT事件处理循环 return0; } 实验结果: 2。 3Bresenham算法编程绘制直线代码: #include〈gl/glut.h> #include〈windows.h> voidInitial(void){ glClearColor(1。 0f,1.0f,1。 0f,1.0f);//设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION);//指定设置投影参数 gluOrtho2D(0。 0,200.0,0。 0,150.0);//设置投影参数 } voidDisplay(void){ glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口 glColor3f(1。 0f,0。 0f,0。 0f);//设置当前的绘图颜色为红色 //Bresenham算法 glBegin(GL_POINTS); intx0=10;inty0=20;intx1=90;inty1=90;intcolor=10; intx,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程序 } intmain(intargc,char*argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的现实模式 glutInitWindowSize(400,300);//设置窗口的尺寸 glutInitWindowPosition(100,200);//设置窗口的位置 glutCreateWindow("点”);//创建一个名为矩形的窗口 glutDisplayFunc(Display);//设置当前窗口的显示函数 Initial();//完成窗口的初始化 glutMainLoop();//启动主GLUT事件处理循环 return0; } 实验结果: 实验三圆绘制实验 1.实验目的 2.实验内容 (一)八分法画圆 圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。 若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的另外7个点(y,x),(—x,y),(—x,-y),(—y,—x),(y,-x),(x,—y)。 (二)中点Bresenham画圆算法 算法步骤如下: 输入圆的半径R 计算初始值d=1-R,x=0,y=R。 绘制点(x,y)及其在八分圆中的另外7个对称点。 判断d的符号。 若d〈0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x—y)+5,再将(x,y)更新为(x+1,y-1)。 当x〈y时,重复步骤 和 ;否则结束。 (三)椭圆的中点Bresenham算法 算法步骤如下: 输入椭圆的长半轴a和短半轴b。 计算初始值d=b^2+a^2(—b+0.25),x=0,y=b。 绘制点(x,y)及其在四分象限上的另外三个对称点。 判断d的符号。 若d〈=0,则先将d更新为d+b^2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b^2(2x+3)+a^2(-2y+2),再将(x,y)更新为(x+1,y-1)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)