计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(32页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
实验一直线的DDA算法
一、【实验目的】
1.掌握DDA算法的基本原理。
2.掌握DDA直线扫描转换算法。
3.深入了解直线扫描转换的编程思想。
二、【实验内容】
1.利用DDA的算法原理,编程实现对直线的扫描转换。
2.加强对DDA算法的理解和掌握。
三、【测试数据及其结果】
四、【实验源代码】
#include
GLsizeiwinWidth=500;
GLsizeiwinHeight=500;
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidDDALine(intx0,inty0,intx1,inty1)
glColor3f(1.0,0.0,0.0);
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);
glVertex2i(int(x+0.5),(int)(y+0.5));
glEnd();
x+=xIncre;
y+=yIncre;
voidDisplay(void)
glClear(GL_COLOR_BUFFER_BIT);
DDALine(100,100,200,180);
glFlush();
voidwinReshapeFcn(GLintnewWidth,GLintnewHeight)
glLoadIdentity();
gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight));
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算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。
绘制直线:
voidlineBres(intx0,inty0,intxEnd,intyEnd)
glColor3f(0.0,0.0,1.0);
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);
glVertex2i(x,y);
while(x{x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;}glPointSize(2);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}}voidinit(void){glClearColor(1.0,1.0,1.0,1.0);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();gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight));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();}绘制圆:#includevoidinit(){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.绘制五环。三、【测试数据及其结果】四、【实验源代码】反走样:#include#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")GLuintlineList;//指定显示列表voidInitial(){glClearColor(1.0f,1.0f,1.0f,0.0f);glLineWidth(12.0f);glColor4f(0.0,0.6,1.0,1.0);lineList=glGenLists(1);//获得一个显示列表标识glNewList(lineList,GL_COMPILE);//定义显示列表glBegin(GL_LINE_LOOP);glVertex2f(1.0f,1.0f);glVertex2f(4.0f,2.0f);glVertex2f(2.0f,5.0f);glEnd();glEndList();}voidChangeSize(GLsizeiw,GLsizeih){if(h==0)h=1;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);//指定设置投影参数glLoadIdentity();if(w<=h)gluOrtho2D(0.0,5.0,0.0,6.0*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,6.0);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();}五环:#include#include#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")constfloatPI=3.1415;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);DrawCircle(3.0);glPopMatrix();glPushMatrix();glTranslatef(7,0,0);glColor3f(1,0,0);DrawCircle(3.0);glPopMatrix();glPushMatrix();glTranslatef(-7,0,0);glColor3f(0,0,1);DrawCircle(3.0);glPopMatrix();glPushMatrix();glTranslatef(-3.5,-3.5,0);glColor3f(0.3,0.5,0.7);DrawCircle(3.0);glPopMatrix();glPushMatrix();glTranslatef(3.5,-3.5,0);glColor3f(0.7,0.0,0.3);DrawCircle(3.0);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.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。三、【测试数据及其结果】四、【实验源代码】#include#includeconstfloatPI=3.1415;voidinitial(void){glClearColor(1.0,1.0,1.0,1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-10.0,10.0,-10.0,10.0);}voidtriangle(GLsizeimode){if(mode==1)glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);elseglPolygonMode(GL_FRONT_AND_BACK,GL_FILL);glBegin(GL_TRIANGLES);glVertex2f(0.0,5.0);glVertex2f(5.0,-5.0);glVertex2f(-5.0,-5.0);glEnd();}voidpolygon(GLsizeimode){if(mode==1)glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);elseglPolygonMode(GL_FRONT_AND_BACK,GL_FILL);glBegin(GL_POLYGON);glVertex2f(2.0,7.0);glVertex2f(5.0,3.0);glVertex2f(4.0,0.0);glVertex2f(0.0,0.0);glVertex2f(1.0,4.0);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(1.0,0.0,0.0);glViewport(0,0,100,100);triangle(1);glColor3f(0.0,0.0,1.0);glViewport(100,0,100,100);triangle(2);glColor3f(1.0,0.0,0.0);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.启用深度测试和模型视图矩阵完成分子动画。三、【测试数据及其结果】四、【实验源代码】#includeGLintangleSelf=0;voidInitial(){glEnable(GL_DEPTH_TEST);glClearColor(1.0f,1.0f,1.0f,1.0f);}voidChangeSize(intw,inth){if(h==0)h=1;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();GLfloatfAspect;fAspect=(float)w/(float)h;gluPerspective(45.0,fAspect,1,500.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidDisplay(void){staticfloatfElect1=0.0f;glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0f,0.0f,-250.0f);glColor3f(1.0f,0.0f,0.0f);
x++;
if(p<0)
p+=twoDy;
y++;
p+=twoDyMinusDx;
glPointSize
(2);
voidinit(void)
glClearColor(1.0,1.0,1.0,1.0);
glShadeModel(GL_FLAT);
voiddisplay(void)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
lineBres(10,10,400,300);
voidmain(intargc,char**argv)
glutInitWindowPosition(10,10);
glutInitWindowSize(winWidth,winHeight);
glutCreateWindow("lineBres");
init();
glutDisplayFunc(display);
绘制圆:
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;
d+=2*(x-y)+5;
y--;
voiddisplay()
glClearColor(1,1,1,1);
glColor3f(1,0,0);
MidBresenhamCircle(8);
glRotated(45,0,0,1);
glutSwapBuffers();
voidreshape(intw,inth)
glViewport(0,0,w,h);
gluOrtho2D(-10,10,-10,10);
intmain(intargc,char**argv)
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
glutCreateWindow("扫描转换圆");
glutReshapeFunc(reshape);
实验三反走样及五环的绘制
1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。
?
2.学会用反走样消除走样现象。
3.学会五环的绘制方法。
1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。
2.绘制五环。
反走样:
#pragmacomment(linker,"/subsystem:
\"windows\"/entry:
\"mainCRTStartup\"")
GLuintlineList;//指定显示列表
voidInitial()
glClearColor(1.0f,1.0f,1.0f,0.0f);
glLineWidth(12.0f);
glColor4f(0.0,0.6,1.0,1.0);
lineList=glGenLists
(1);//获得一个显示列表标识
glNewList(lineList,GL_COMPILE);//定义显示列表
glBegin(GL_LINE_LOOP);
glVertex2f(1.0f,1.0f);
glVertex2f(4.0f,2.0f);
glVertex2f(2.0f,5.0f);
glEndList();
voidChangeSize(GLsizeiw,GLsizeih)
if(h==0)h=1;
glMatrixMode(GL_PROJECTION);//指定设置投影参数
if(w<=h)
gluOrtho2D(0.0,5.0,0.0,6.0*(GLfloat)h/(GLfloat)w);
else
gluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,6.0);
glMatrixMode(GL_MODELVIEW);//指定设置模型视图变换参数
voidDisplayt(void)
glCallList(lineList);//调用显示列表
voidDisplayw(void){
glEnable(GL_LINE_SMOOTH);//使用反走样
glEnable(GL_BLEND);//启用混合函数
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定混合函数
voidmain(void)
glutInitWindowSize(300,300);
glutCreateWindow("原始图形");
glutDisplayFunc(Displayt);
glutReshapeFunc(ChangeSize);
glutInitWindowPosition(300,300);
glutCreateWindow("反走样图形");
glutDisplayFunc(Displayw);
五环:
constfloatPI=3.1415;
voidDrawCircle(GLfloatradius)
GLfloatx,y,z;
for(intalpha=0;alpha<360;alpha++)
x=radius*cos(alpha*PI/180);
y=radius*sin(alpha*PI/180);
z=0;
glVertex3f(x,y,z);
voidDisplay()
glTranslatef(0,0,-25);
glColor3f(0,1,0);
glLineWidth(3);
DrawCircle(3.0);
glPopMatrix();
glPushMatrix();
glTranslatef(7,0,0);
glTranslatef(-7,0,0);
glColor3f(0,0,1);
glTranslatef(-3.5,-3.5,0);
glColor3f(0.3,0.5,0.7);
glTranslatef(3.5,-3.5,0);
glColor3f(0.7,0.0,0.3);
gluPerspective(45,GLdouble(w)/h,1,100);
glMatrixMode(GL_MODELVIEW);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowSize(500,500);
glutCreateWindow("Test");
实验四多视区
1.熟练掌握各种裁剪算法和二维观察变换。
2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。
1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。
2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。
voidinitial(void)
gluOrtho2D(-10.0,10.0,-10.0,10.0);
voidtriangle(GLsizeimode)
if(mode==1)
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBegin(GL_TRIANGLES);
glVertex2f(0.0,5.0);
glVertex2f(5.0,-5.0);
glVertex2f(-5.0,-5.0);
voidpolygon(GLsizeimode)
glBegin(GL_POLYGON);
glVertex2f(2.0,7.0);
glVertex2f(5.0,3.0);
glVertex2f(4.0,0.0);
glVertex2f(0.0,0.0);
glVertex2f(1.0,4.0);
voidDrawCircle(GLfloatr)
x=r*cos(alpha*PI/180);
y=r*sin(alpha*PI/180);
glViewport(0,0,100,100);
triangle
(1);
glViewport(100,0,100,100);
glViewport(0,100,100,100);
polygon
glViewport(100,100,100,100);
DrawCircle(5);
glutInitWindowSize(400,200);
glutCreateWindow("多视区");
initial();
实验五分子模型
1.熟练掌握二维、三维几何变换矩阵和透视投影的相关知识从而用opengl实现分子模型的运动。
2.熟练掌握opengl中相关函数的调用和实现。
1.显示分子模型:
红色大球表示原子,三个黄色小球表示电子,分别绕原子旋转,采用透视投影变换显示电子旋转过程。
2.启用深度测试和模型视图矩阵完成分子动画。
GLintangleSelf=0;
glEnable(GL_DEPTH_TEST);
voidChangeSize(intw,inth)
GLfloatfAspect;
fAspect=(float)w/(float)h;
gluPerspective(45.0,fAspect,1,500.0);
voidDisplay(void){
staticfloatfElect1=0.0f;
glTranslatef(0.0f,0.0f,-250.0f);
glColor3f(1.0f,0.0f,0.0f);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1