计算机图形学实验报告

  • 格式:docx
  • 大小:47.38 KB
  • 文档页数:21

下载文档原格式

  / 21
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

实验一直线的DDA算法

一、【实验目的】

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

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

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

二、【实验内容】

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

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

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

四、【实验源代码】

GLsizei winWidth=500;

GLsizei winHeight=500;

void Initial(void)

{

glMatrixMode(GL_PROJECTION);

}

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

{

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

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

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算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。

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

四、【实验源代码】

绘制直线:

GLsizei winWidth=500;

GLsizei winHeight=500;

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

{

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)

{

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

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

}

绘制圆:

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

}