计算机图形学实验报告Word文档下载推荐.docx
- 文档编号:16749080
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:45
- 大小:114.82KB
计算机图形学实验报告Word文档下载推荐.docx
《计算机图形学实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告Word文档下载推荐.docx(45页珍藏版)》请在冰豆网上搜索。
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);
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直线的绘制:
//设置当前的绘图颜色为红色
glBegin(GL_LINE_LOOP);
//五角星
glVertex2i(10,10);
glVertex2i(30,35);
glVertex2i(50,10);
glVertex2i(5,25);
glVertex2i(55,25);
3.3多边形面的绘制:
glBegin(GL_TRIANGLES);
//等边三角形
glVertex2f(0.0,0.0);
glVertex2f(15,25.95);
glVertex2f(30,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)。
绘图过程如下:
.输入直线的两端点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。
.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数值微分算法编程绘制直线代码:
windows.h>
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;
}
实验结果:
2.2中点画线算法编程绘制直线代码:
glBegin(GL_POINTS);
intx0=50;
intx1=100;
inty1=120;
intdx,dy,d,UpIncre,DownIncre,x,y;
if(x0>
x1)
x=x1;
x1=x0;
x0=x;
y=y1;
y1=y0;
y0=y;
y=y0;
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;
2.3Bresenham算法编程绘制直线代码:
#include<
voidInitial(void){
//指定设置投影参数
voidDisplay(void){
//用当前背景色填充窗口
//设置当前的绘图颜色为红色
//Bresenham算法
intx0=10;
inty0=20;
intx1=90;
inty1=90;
intx,y,dx,dy,e;
dx=x1-x0;
dy=y1-y0;
e=-dx;
x=x0;
=x1){
glVertex2i(x,y);
x++;
e=e+2*dy;
if(e>
0){
y++;
e=e-2*dx;
}
//清空OpenGL命令缓冲区,执行OpenGL程序
intmain(intargc,char*argv[]){
//初始化窗口的现实模式
glutInitWindowPosition(100,200);
//设置窗口的位置
点"
//创建一个名为矩形的窗口
//设置当前窗口的显示函数
//完成窗口的初始化
//启动主GLUT事件处理循环
实验三圆绘制实验
(一)八分法画圆
圆心位于原点的圆有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)及其在四分象限上的另外三个对称点。
=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)。
当b^2(x+1)<
a^2(y-0.5)时,重复步骤
否则转到步骤
用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2
=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+1,y-1);
否则先将d更新为d+a^2(-2y+3),再将(x,y)更新为(x,y-1)。
当y>
=0时,重复步骤
3.1八分法画圆程序代码:
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);
CirclePoint(10,20,20);
3.2中点Bresenham算法绘制圆代码
gl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告