您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 计算机图形学实验一:画直线
贵州大学实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131姓名学号实验组实验时间指导教师黄初华成绩实验项目名称直线生成实验目的实验目的通过本实验,使学生了解并掌握在光栅显示系统中直线的生成和显示算法,熟悉相关开发平台。为后继实验打下基础。实验要求实验组织运行要求以学生自主训练为主的开放模式组织教学。实验原理中点画线法算法原理:设0k1中点M在直线下方,下一点取p1点;中点M在直线上方取p2点。中点算法用整数加法及比较代替了DDA中的浮点数加法及取整运算,效率大大提高。假设直线的起点、终点分别为:(X0,Y0),(X1,Y1),直线将二维空间划分为三个区域:直线方程:F(x,y)=ax+by+c=0其中:a=-(y1-y0),b=(x1-x0),c=-B(x1-x0)如F(x,y)=0,则(x,y)在直线上如F(x,y)0,则(x,y)在直线下方如F(x,y)0,则(x,y)在直线上方因此,可将中点M的坐标(Xp+1,Yp+0.5)代入直线方程,并判断其符号即可确定象素点的选取。定义决策变量:d=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c如果d0,则M在理想直线上方,选正右方P2点;xPi=(xi,yi)MQP1p2yyxF(x,y)=0F(x,y)0F(x,y)0(x1,y1)(x0,y0)如果d0,则M在理想直线下方,选右上方P1点;如果d=0,则M在理想直线上,选P1/P2点。由于d是xi和yi的线性函数,可采用增量计算提高运算效率。1.如由pi点确定在是正右方P2点(d0).,则新的中点M仅在x方向加1,新的d值为:dnew=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c而dold=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+cdnew=dold+a=dold-dy2.如由pi点确定是右上方P1点(d0),则新的中点M在x和y方向都增加1,新的d值为dnew=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c而dold=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+cdnew=dold+a+b=dold-dy+dx在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值:d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2F(x0,y0)=0,(x0,y0)在直线上。为了消除d的分数,重新定义F(x,y)=2(ax+by+c)则每一步需要计算的dnew是简单的整数加法dy=y1-y0,dx=x1-x0d0=-2dy+dxdnew=dold-2*dy,当dold=0dnew=dold-2(dy-dx),当dold0Bresenham画线算法算法原理:与DDA算法相似,Bresenham画线算法也要在每列象素中找到与理想直线最逼近的象素点。根据直线的斜率来确定变量在x或y方向递增一个单位。另一个方向y或x的增量为0或1,它取决于实际直线与最接近网格点位置的距离。这一距离称为误差。算法的巧妙构思,使每次只需检查误差项(增量)的符号即可。定义决策变量:d=d+k(0k1)设0k1,如直线上的一点为(x,y),则下一点为:(x+1,y)(d0.5)或(x+1,y+1)(d=0.5)当d1时,让d=d-1,以保证0=d1,d0=0令e=d-0.5(0k1),则e0=-0.5则下一点为:(x+1,y),(e0)(x+1,y+1)(e=0)当e0时,让e=e-1,(重新初始化误差项)由于算法只用到误差项的符号,为了改用整数以避免除法,可以作如下替换:e=2*e*dx定义决策变量e=2*e*dx,则e0=-dx,e=e+2*dy则下一点为:(x+1,y),(e0)(x+1,y+1)(e=0)当e0时,让e=e-dx,(重新初始化误差项)实验环境实验条件硬件平台:PC软件(推荐):Windows平台,Visualstdio2013,OpenGL实验步骤实验步骤1.掌握算法原理;2.依据算法,编写源程序并进行调试;3.对运行结果进行保存与分析;4.把源程序以文件的形式提交;5.按格式书写实验报告实验内容#includestdafx.h#includeglut.h#includeiostream#includecmath#includestdio.husingnamespacestd;voidinit(){glClearColor(1.0,1.0,1.0,1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,200.0,0.0,150.0);}voidIntegerBresenhamline(){intx1=10,y1=10,x2=150,y2=100;intdx=abs(x2-x1);intdy=abs(y2-y1);intx,y;inte=-dx;if(x1x2){x=x2;y=y2;x2=x1;}else{x=x1;y=y1;}glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);glVertex2i(x,y);while(xx2){if(e=0){y++;e=e-2*dx;}glVertex2i(x,y);x++;e+=2*dy;}glEnd();glFlush();}voidMidPointLine(){intx,y,x1=10,y1=10,x2=150,y2=100;intdy=y1-y2;intdx=x2-x1;intd=2*dy+dx;intdx1=2*dy;intdx2=2*(dx+dy);if(x1x2){x=x2;y=y2;x2=x1;}else{x=x1;y=y1;}glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);glVertex2i(x,y);while(xx2){if(d0){y++;x++;d+=dx2;}else{x++,d+=dx1;}glVertex2i(x,y);}glEnd();glFlush();}intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,300);intchoice;printf(输入你想画的直线0代表Bresenham1代表中点画线\n);while(1){scanf(%d,&choice);switch(choice){case0:glutCreateWindow(BresenhamDrawLine);init();glutDisplayFunc(IntegerBresenhamline);glutMainLoop();break;case1:glutCreateWindow(middlePointLine);init();glutDisplayFunc(MidPointLine);glFlush();glutMainLoop();break;default:printf(输入有误,请重新输入\n);break;}}return0;}实验结果实验总结通过这次试验我对于中点生成算法和Bresenham生成算法有了进一步的了解,在平时上课的基础上对计算机图形学有了更深的认识,同时对课程内容也更加了解。指导教师意见签名:年月日
本文标题:计算机图形学实验一:画直线
链接地址:https://www.777doc.com/doc-7070764 .html