计算机图形学实验报告.docx

上传人:b****4 文档编号:12164613 上传时间:2023-04-17 格式:DOCX 页数:45 大小:192.88KB
下载 相关 举报
计算机图形学实验报告.docx_第1页
第1页 / 共45页
计算机图形学实验报告.docx_第2页
第2页 / 共45页
计算机图形学实验报告.docx_第3页
第3页 / 共45页
计算机图形学实验报告.docx_第4页
第4页 / 共45页
计算机图形学实验报告.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

计算机图形学实验报告.docx

《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(45页珍藏版)》请在冰豆网上搜索。

计算机图形学实验报告.docx

计算机图形学实验报告

计算机图形学实验报告

姓名:

学号:

班级:

时间:

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

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();return0;

〃设置窗口的尺寸

//设置窗口位置

〃创建一个名为矩形的窗口

〃设置当前窗口的显示回调函数

//完成窗口初始化

//完成窗口GLUT事件处理循环

}

 

运行结果:

3.2直线的绘制:

#includevoidInitial(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);//初始化窗口的显示模式

运行结果:

3.3多边形面的绘制:

#include

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();

}

intmain(intargc,char*argv[])

〃清空OpenGL命令缓冲区,执行

OpenGL程序

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式

glutInitWindowSize(400,300);〃设置窗口的尺寸

glutInitWindowPosition(100,120);//设置窗口位置

 

〃创建一个名为矩形的窗口

〃设置当前窗口的显示回调函数

//完成窗口初始化

〃完成窗口GLUT事件处理循环

glutCreateWindow(”矩形”);glutDisplayFunc(Display);Initial();

glutMainLoop();return0;

运行结果:

■矩至orn^x

 

 

 

实验二直线绘制实验

1.实验目的

为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算

法中最常用的三种算法:

数值微分法、中点画线算法和Bresenham算法。

2.实验内容

(1)数值微分法

数值微分法直接从直线的微分方程生成直线。

给定直线的两端点:

P0(X0,Y0)和

P1(X1,Y1),得到直线的微分方程dy/dx=△『/△x=(Y1-Y0)/(X1-X0)=k。

数值微分算法的原理是,由于直线的一阶导数是连续的,而且△x和厶y是成比例的,

因此通过在当前位置(Xi,Yi)分别加上两个小增量x和£厶y(&为无穷小的正数)来求下一点(X(i+1),Y(i+1))的x,y坐标。

(2)中点画线算法

给定直线的两端点:

P0(X0,Y0)和P1(X1,Y1),可得到直线方程F(x,y)=y-kx-b=0且k=△y/△x=(Y1-Y0)/(X1-X0)。

绘图过程如下:

1•输入直线的两端点PO(XO,YO)和P1(X1,Y1)。

2•计算初始值△x,△y,d=△x-2△y,x=XO,y=YO.

3.绘制点(x,y)。

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

△y;否则(x,y)更新为(x+1,y),d更新为△y。

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

(3)Bresenham算法

算法步骤如下:

②1•输入直线两端点P0(X0,Y0)和P1(X1,Y1)。

②•计算初始值△x,△y,e=-△x,x=XO,y=YO。

②3•绘制点(x,y)。

②.e更新为e+2Ay。

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

②•当直线没有画完时,重复步骤②3和②;否则结束。

3.实验代码及结果

3.1数值微分算法编程绘制直线代码:

#include

#include

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();

}

intmain(intargc,char*argv[])

{

//

//清空OpenGL命令缓冲区,执行OpenGL程序

glutInit(&argc,argv);

实验结果:

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式

2.2中点画线算法编程绘制直线代码:

#include

#include

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,Downlncre,x,y;

if(x0>x1)

{

x=x1;x1=x0;x0=x;

y=y1;y1=yO;yO=y;

}

x=xO;y=yO;

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();

return0;

//设置窗口的尺寸

//设置窗口位置

//创建一个名为矩形的窗口

//设置当前窗口的显示回调函数

//完成窗口初始化

//完成窗口GLUT事件处理循环

}

实验结果:

2.3Bresenham算法编程绘制直线代码:

#inelude

#inelude

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;intyO=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[]){

glutlnit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);〃初始化窗口的现实模式

glutInitWindowSize(400,300);〃设置窗口的尺寸

glutInitWindowPosition(100,200);//设置窗口的位置glutCreateWindow(”点");〃创建一个名为矩形的窗口

glutDisplayFunc(Display);〃设置当前窗口的显示函数

Initial();〃完成窗口的初始化

glutMainLoop();//启动主GLUT事件处理循环

return0;

}

实验结果:

实验三圆绘制实验

1.实验目的

2.实验内容

(1)八分法画圆

圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。

若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的另外7个点(y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x,-y)。

(2)中点Bresenham画圆算法

算法步骤如下:

1输入圆的半径R

2计算初始值d=1-R,x=O,y=R。

3绘制点(x,y)及其在八分圆中的另外7个对称点。

4判断d的符号。

若d<0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将

d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。

5当x

(3)椭圆的中点Bresenham算法

算法步骤如下:

⑤1输入椭圆的长半轴a和短半轴b。

⑤计算初始值d=bA2+aA2(-b+0.25),x=0,y=b。

⑤绘制点(x,y)及其在四分象限上的另外三个对称点。

⑤判断d的符号。

若d<=0,则先将d更新为d+bA2(2x+3),再将(x,y)更新为(x+1,y);否则先

将d更新为d+bA2(2x+3)+aA2(-2y+2),再将(x,y)更新为(x+1,y-1)。

⑤当bA2(x+1)

⑤6用上半部分计算的最后点(x,y)来计算下半部分中d的初值

d=bA2(x+0.5)A2+aA2(y-1)A2-aA2bA2

⑤绘制点(x,y)及其在四分象限上的另外三个对称点。

⑤判断d的符号。

若d<=0,则先将d更新为d+bA2(2x+2)+aA2(-2y+3),再将(x,y)更新为

(x+1,y-1);否则先将d更新为d+aA2(-2y+3),再将(x,y)更新为(x,y-1)。

$当y>=0时,重复步骤O7和(8;否则结束。

3.实验代码及结果

3.1八分法画圆程序代码:

#include

#include

voidInitial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数

}

voidCirclePoint(intx,inty,intcolor){

glVertex2i(x+50,y+50);

glVertex2i(y+50,x+50);

glVertex2i(-y+50,x+50);

glVertex2i(-x+50,y+50);

glVertex2i(-x+50,-y+50);

glVertex2i(-y+50,-x+50);

glVertex2i(y+50,-x+50);

glVertex2i(x+50,-y+50);

}

voidDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色

glPointSize(10);

glBegin(GL_POINTS);

CirclePoint(10,20,20);

glEnd();

OpenGL程序

glFlush();//清空OpenGL命令缓冲区,执行

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸

glutInitWindowPosition(100,120);//设置窗口位置

实验结果:

3.2中点Bresenham算法绘制圆代码

#include

#includevoidInitial(void)

{

//指定设置投影参数

//设置投影参数

glClearColor(1.0f,1.0f,1.0f,1.0f);〃设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);

}voidCirclePoint(intx,inty,intcolor){

glVertex2i(x+50,y+50);

glVertex2i(y+50,x+50);

glVertex2i(-y+50,x+50);

glVertex2i(-x+50,y+50);

glVertex2i(-x+50,-y+50);

glVertex2i(-y+50,-x+50);

glVertex2i(y+50,-x+50);

glVertex2i(x+50,-y+50);}

voidMidBresenhamCircle(intr,intcolor)

{

intx,y,d;x=0;y=r;d=1-r;

while(x<=y)

{

CirclePoint(x,y,color);

if(d<0)

d+=2*x+3;

else

{

d+=2*(x-y)+5;

y--;

}

x++;

}

}

voidDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色

glPointSize(3);

glBegin(GL_POINTS);

MidBresenhamCircle(20,10);

glEnd();glFlush();

//清空OpenGL命令缓冲区,执行OpenGL程序

 

}

intmain(intargc,char*argv[])

{glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式

glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow("矩形");glut

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1