计算机图形学实验报告.docx
- 文档编号:17710721
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:33
- 大小:42.11KB
计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(33页珍藏版)》请在冰点文库上搜索。
计算机图形学实验报告
实验一直线的DDA算法
一、【实验目的】
1.掌握DDA算法的基本原理。
2.掌握DDA直线扫描转换算法。
3.深入了解直线扫描转换的编程思想。
二、【实验内容】
1.利用DDA的算法原理,编程实现对直线的扫描转换。
2.加强对DDA算法的理解和掌握。
三、【测试数据及其结果】
四、【实验源代码】
GLsizeiwinWidth=500;
GLsizeiwinHeight=500;
voidInitial(void)
{
glMatrixMode(GL_PROJECTION);
}
voidDDALine(intx0,inty0,intx1,inty1)
{
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++)
{
glPointSize(3);
glBegin(GL_POINTS);
glEnd();
x+=xIncre;
y+=yIncre;
}
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
DDALine(100,100,200,180);
glFlush();
}
voidwinReshapeFcn(GLintnewWidth,GLintnewHeight)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
winWidth=newWidth;
winHeight=newHeight;
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("line");
Initial();
glutDisplayFunc(Display);
glutReshapeFunc(winReshapeFcn);
glutMainLoop();
return0;
}
实验二Bresenham绘制直线和圆
一、【实验目的】
1.掌握Bresenham算法扫描转换圆和直线的基本原理。
二、【实验内容】
1.利用Bresenham算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。
三、【测试数据及其结果】
四、【实验源代码】
绘制直线:
GLsizeiwinWidth=500;
GLsizeiwinHeight=500;
voidlineBres(intx0,inty0,intxEnd,intyEnd)
{
intdx=fabs(xEnd-x0),dy=fabs(yEnd-y0);
intp=2*dy-dx;
inttwoDy=2*dy,twoDyMinusDx=2*(dy-dx);
intx,y;
if(x0>xEnd)
{
x=xEnd;
y=yEnd;
xEnd=x0;
}
else{
x=x0;
y=y0;
}
glPointSize(6);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
while(x { x++; if(p<0) p+=twoDy; else{ y++; p+=twoDyMinusDx; } glPointSize (2); glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); } } voidinit(void) { glShadeModel(GL_FLAT); } voiddisplay(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); lineBres(10,10,400,300); glFlush(); } voidwinReshapeFcn(GLintnewWidth,GLintnewHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); winWidth=newWidth; winHeight=newHeight; } voidmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(10,10); glutInitWindowSize(winWidth,winHeight); glutCreateWindow("lineBres"); init(); glutDisplayFunc(display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); } 绘制圆: voidinit() { glClearColor(0,0,0,0); } voidMidBresenhamCircle(intr) { intx,y,d; x=0; y=r; d=1-r; glBegin(GL_LINE_STRIP); while(x<=y){ glVertex2f(x,y); if(d<0)d+=2*x+3; else{ d+=2*(x-y)+5; y--; } x++; } glEnd(); } voiddisplay() { glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1,0,0); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glRotated(45,0,0,1); MidBresenhamCircle(8); glutSwapBuffers(); } voidreshape(intw,inth) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-10,10,-10,10); } intmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(100,100); glutCreateWindow("扫描转换圆"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return0; } 实验三反走样及五环的绘制 一、【实验目的】 1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。 ? 2.学会用反走样消除走样现象。 3.学会五环的绘制方法。 二、【实验内容】 1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。 2.绘制五环。 三、【测试数据及其结果】 四、【实验源代码】 反走样: #pragmacomment(linker,"/subsystem: \"windows\"/entry: \"mainCRTStartup\"") GLuintlineList;//指定显示列表 voidInitial() { glClearColor(,,,); glLineWidth(); glColor4f lineList=glGenLists (1);//获得一个显示列表标识 glNewList(lineList,GL_COMPILE);//定义显示列表 glBegin(GL_LINE_LOOP); glVertex2f(,); glVertex2f(,); glVertex2f(,); glEnd(); glEndList(); } voidChangeSize(GLsizeiw,GLsizeih) { if(h==0)h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION);//指定设置投影参数 glLoadIdentity(); if(w<=h) else glMatrixMode(GL_MODELVIEW);//指定设置模型视图变换参数 glLoadIdentity(); } voidDisplayt(void) { glClear(GL_COLOR_BUFFER_BIT); glCallList(lineList);//调用显示列表 glFlush(); } voidDisplayw(void){ glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_LINE_SMOOTH);//使用反走样 glEnable(GL_BLEND);//启用混合函数 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定混合函数 glCallList(lineList);//调用显示列表 glFlush(); } voidmain(void) { glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(300,300); glutCreateWindow("原始图形"); glutDisplayFunc(Displayt); glutReshapeFunc(ChangeSize); Initial(); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(300,300); glutInitWindowSize(300,300); glutCreateWindow("反走样图形"); glutDisplayFunc(Displayw); glutReshapeFunc(ChangeSize); Initial(); glutMainLoop(); } 五环: #pragmacomment(linker,"/subsystem: \"windows\"/entry: \"mainCRTStartup\"") voidDrawCircle(GLfloatradius) { GLfloatx,y,z; glBegin(GL_LINE_LOOP); for(intalpha=0;alpha<360;alpha++) { x=radius*cos(alpha*PI/180); y=radius*sin(alpha*PI/180); z=0; glVertex3f(x,y,z); } glEnd(); } voidDisplay() { glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,-25); glColor3f(0,1,0); glLineWidth(3); glPopMatrix(); glPushMatrix(); glTranslatef(7,0,0); glColor3f(1,0,0); glPopMatrix(); glPushMatrix(); glTranslatef(-7,0,0); glColor3f(0,0,1); glPopMatrix(); glPushMatrix(); glColor3f glPopMatrix(); glPushMatrix(); glColor3f glPopMatrix(); glutSwapBuffers(); } voidreshape(intw,inth) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,GLdouble(w)/h,1,100); glMatrixMode(GL_MODELVIEW); } voidmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowPosition(10,10); glutInitWindowSize(500,500); glutCreateWindow("Test"); glutDisplayFunc(Display); glutReshapeFunc(reshape); glutMainLoop(); } 实验四多视区 一、【实验目的】 1.熟练掌握各种裁剪算法和二维观察变换。 ? 2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。 二、【实验内容】 1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。 ? 2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。 三、【测试数据及其结果】 四、【实验源代码】 voidinitial(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); } voidtriangle(GLsizeimode) { if(mode==1) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_TRIANGLES); glVertex2f glVertex2f glVertex2f glEnd(); } voidpolygon(GLsizeimode) { if(mode==1) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_POLYGON); glVertex2f glVertex2f glVertex2f glVertex2f glVertex2f glEnd(); } voidDrawCircle(GLfloatr) { GLfloatx,y,z; glBegin(GL_LINE_LOOP); for(intalpha=0;alpha<360;alpha++) { x=r*cos(alpha*PI/180); y=r*sin(alpha*PI/180); z=0; glVertex3f(x,y,z); } glEnd(); } voidDisplay() { glClear(GL_COLOR_BUFFER_BIT); glColor3f glViewport(0,0,100,100); triangle (1); glColor3f glViewport(100,0,100,100); triangle (2); glColor3f glViewport(0,100,100,100); polygon (2); glViewport(100,100,100,100); DrawCircle(5); glFlush(); } voidmain(void) { glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(10,10); glutInitWindowSize(400,200); glutCreateWindow("多视区"); initial(); glutDisplayFunc(Display); glutMainLoop(); } 实验五分子模型 一、【实验目的】 1.熟练掌握二维、三维几何变换矩阵和透视投影的相关知识从而用opengl实现分子模型的运动。 ? 2.熟练掌握opengl中相关函数的调用和实现。 二、【实验内容】 1.显示分子模型: 红色大球表示原子,三个黄色小球表示电子,分别绕原子旋转,采用透视投影变换显示电子旋转过程。 2.启用深度测试和模型视图矩阵完成分子动画。 三、【测试数据及其结果】 四、【实验源代码】 GLintangleSelf=0; voidInitial() { glEnable(GL_DEPTH_TEST); glClearColor(,,,); } voidChangeSize(intw,inth) { if(h==0)h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloatfAspect; fAspect=(float)w/(float)h; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } voidDisplay(void){ staticfloatfElect1=; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(,,); glColor3f(,,); glutWireSphere(,15,15); glColor3f(,,); glPushMatrix(); glRotatef(fElect1,,,); glTranslatef(,,); glRotatef(angleSelf,0,1,0); glutWireSphere(,15,15); glPopMatrix(); glPushMatrix(); glRotatef(,,,); glRotatef(fElect1,,,); glTranslatef(,,); glRotatef(angleSelf,0,1,0); glutWireSphere(,15,15); glPopMatrix(); glPushMatrix(); glRotatef(,,,); glRotatef(fElect1,, glTranslatef(,,); glRotatef(angleSelf,0,1,0); glutWireSphere(,15,15); glPopMatrix(); fElect1+=; if(fElect1>)fElect1=; glutSwapBuffers(); } voidRotateSelf(intvalue) { if(value==1) { angleSelf+=5; angleSelf%=360; glutPostRedisplay(); glutTimerFunc(100,RotateSelf,1); } } voidTimerFunc(intvalue) { glutPostRedisplay(); glutTimerFunc(100,TimerFunc,1); } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutCreateWindow("分子动画示例"); glutReshapeFunc(ChangeSize); glutDisplayFunc(Display); glutTimerFunc(500,TimerFunc,1); glutTimerFunc(100,RotateSelf,1); Initial(); glutMainLoop(); return0; } 实验六Bezier曲线 一、【实验目的】 1.掌握Bezire曲线定义。 ? 2.掌握设计绘制一次、二次和三次Bezier曲线算法。 二、【实验内容】 1.绘制NURBS曲面。 2.基于Bezier定义根据控制多边形的阶次绘制? Bezier曲线。 三、【测试数据及其结果】 四、【实验源代码】 原实验代码: classPt3D{ public: GLfloatx,y,z;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告