计算机图形学实验资料报告材料

计算机图形学实验资料报告材料
计算机图形学实验资料报告材料

姓名:学号:

目录

实验一直线的DDA算法

一、【实验目的】

1.掌握DDA算法的基本原理。

2.掌握DDA直线扫描转换算法。

3.深入了解直线扫描转换的编程思想。

二、【实验容】

1.利用DDA的算法原理,编程实现对直线的扫描转换。

2.加强对DDA算法的理解和掌握。

三、【测试数据及其结果】

四、【实验源代码】

#include

#include

#include

#include

GLsizei winWidth=500;

GLsizei winHeight=500;

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0);

}

void DDALine(int x0,int y0,int x1,int y1) {

glColor3f(1.0,0.0,0.0);

int dx,dy,epsl,k;

float x,y,xIncre,yIncre;

dx=x1-x0; dy=y1-y0;

x=x0; y=y0;

if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=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;

}

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush();

}

void winReshapeFcn(GLint newWidth, GLint newHeight)

{

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));

glClear(GL_COLOR_BUFFER_BIT);

winWidth=newWidth;

winHeight=newHeight;

}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300);

glutInitWindowPosition(100,120);

glutCreateWindow("line");

Initial();

glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop();

return 0;

}

实验二Bresenham绘制直线和圆

一、【实验目的】

1.掌握Bresenham算法扫描转换圆和直线的基本原理。

二、【实验容】

1.利用Bresenham算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。

三、【测试数据及其结果】

四、【实验源代码】

绘制直线:

#include

#include

#include

#include

GLsizei winWidth=500;

GLsizei winHeight=500;

void lineBres(int x0, int y0, int xEnd, int yEnd) {

glColor3f(0.0, 0.0, 1.0);

int dx=fabs(xEnd-x0), dy=fabs(yEnd-y0); int p=2*dy-dx;

int twoDy=2*dy, twoDyMinusDx=2*(dy-dx);

int x, 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();

}

}

void init (void)

{

glClearColor(1.0, 1.0, 1.0, 1.0); glShadeModel(GL_FLAT);

}

void display (void)

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

lineBres(10, 10, 400, 300);

glFlush();

}

void winReshapeFcn(GLint newWidth, GLint newHeight)

{

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));

glClear(GL_COLOR_BUFFER_BIT);

winWidth=newWidth;

winHeight=newHeight;

}

void main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(10, 10);

glutInitWindowSize(winWidth, winHeight);

glutCreateWindow("lineBres");

init();

glutDisplayFunc(display);

glutReshapeFunc(winReshapeFcn);

glutMainLoop();

}

绘制圆:

#include

void init()

{

glClearColor(0,0,0,0);

}

void MidBresenhamCircle(int r) {

int x,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();

}

void display()

{

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

}

void reshape(int w,int h)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION); glLoadIdentity();

gluOrtho2D(-10,10,-10,10);

}

int main(int argc,char**argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(100,100); glutCreateWindow("扫描转换圆"); glutDisplayFunc(display); glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

实验三反走样及五环的绘制

一、【实验目的】

1.了解走样和反走样的容,熟练掌握用opengl实现图形的反走样。

2.学会用反走样消除走样现象。

3.学会五环的绘制方法。

二、【实验容】

1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。

2.绘制五环。

三、【测试数据及其结果】

四、【实验源代码】

反走样:

#include

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") GLuint lineList; //指定显示列表

void Initial()

{

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

}

void ChangeSize(GLsizei w,GLsizei h)

{

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

else

gluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,6.0);

glMatrixMode(GL_MODELVIEW); //指定设置模型视图变换参数

glLoadIdentity();

}

void Displayt(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glCallList(lineList); //调用显示列表

glFlush();

}

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

}

void main(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

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") const float PI=3.1415;

void DrawCircle(GLfloat radius)

{

GLfloat x,y,z;

glBegin(GL_LINE_LOOP);

for (int alpha=0;alpha<360;alpha++)

{

x=radius*cos(alpha*PI/180);

y=radius*sin(alpha*PI/180);

z=0;

glVertex3f(x,y,z);

}

glEnd();

}

void Display()

{

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

}

void reshape(int w,int h)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(45,GLdouble(w)/h,1,100);

glMatrixMode(GL_MODELVIEW);

}

void main(int argc,char **argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);

glutInitWindowPosition(10,10);

glutInitWindowSize(500,500);

glutCreateWindow("Test");

glutDisplayFunc(Display);

glutReshapeFunc(reshape);

glutMainLoop();

}

相关主题
相关文档
最新文档