计算机图形学实验报告Word文档格式.doc
《计算机图形学实验报告Word文档格式.doc》由会员分享,可在线阅读,更多相关《计算机图形学实验报告Word文档格式.doc(34页珍藏版)》请在冰点文库上搜索。
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)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight));
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算法
实验二
实验二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;
glPointSize(6);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
while(x<
x++;
if(p<
0)
p+=twoDy;
else{
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);
glFlush();
voidmain(intargc,char**argv)
argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(10,10);
glutInitWindowSize(winWidth,winHeight);
lineBres"
init();
glutDisplayFunc(display);
glutReshapeFunc(winReshapeFcn);
绘制圆:
gl/glut.h>
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);
glRotated(45,0,0,1);
glutSwapBuffers();
voidreshape(intw,inth)
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-10,10,-10,10);
intmain(intargc,char**argv)
glutInit(&
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(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;
//指定设置投影参数
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);
//调用显示列表
glFlush();
voidDisplayw(void){
glEnable(GL_LINE_SMOOTH);
//使用反走样
glEnable(GL_BLEND);
//启用混合函数
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//指定混合函数
voidmain(void)
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(300,300);
原始图形"
glutDisplayFunc(Displayt);
glutReshapeFunc(ChangeSize);
Initial();
glutInitWindowPosition(300,300);
反走样图形"
glutDisplayFunc(Displayw);
glutReshapeFunc(ChangeSize);
五环:
#include<
MATH.H>
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);
DrawCircle(3.0);
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);
glutSwapBuffers();
gluPerspective(45,GLdouble(w)/h,1,100);
voidmain(intargc,char**argv)
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowPosition(10,10);
glutInitWindowSize(500,500);
Test"
glutDisplayFunc(Display);
多视区
实验四
实验四多视区
1.熟练掌握各种裁剪算法和二维观察变换。
2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。
1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。
2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。
voidinitial(void)
glClearColor(1.0,1.0,1.0,1.0);
gluOrtho2D(-10.0,10.0,-10.0,10.0);
voidtriangle(GLsizeimode)
if(mode==1)
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
else
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);
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);
glViewport(0,100,100,100);
polygon
(2);
glViewport(100,100,100,100);
DrawCircle(5);
glutInitWindowSize(400,200);
多视区"
initial();
分子模型
实验五
实验五分子模型
1.熟练掌握二维、三维几何变换矩阵和透视投影的相关知识从而用opengl实现分子模型的运动。
2.熟练掌握opengl中相关函数的调用和实现。
1.显示分子模型:
红色大球表示原子,三个黄色小球表示电子,分别绕原子旋转,采用透视投影变换显示电子旋转过程。
2.启用深度测试和模型视图矩阵完成分子动画。
GLintangleSelf=0;
voi