欢迎来到天天文库
浏览记录
ID:43854836
大小:67.50 KB
页数:8页
时间:2019-10-16
《【精品】实验二二维基本图元的生成》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验二二维基本图元的生成实验目的:通过实验掌握下列知识:1.进一步掌握OpenGL的绘制原理;2.直线生成算法的理解与实现;3.圆生成算法的理解与实现;4.椭圆生成算法的理解与实现;内容及步骤:一、实现DDA直线生成算法读懂课本第72页所给的如下代码,理解执行的原理:#include#includeinlineintround(constfloata){returnint(a+0-5);}voidlineDDA(intxO,intyO,intxEnd,intyEnd){intdx=xEnd-xO,dy=yEn
2、d-yO,steps,k;floatxlncrement,ylncrement,x=xO,y=yO;if(fabs(dx)>fabs(dy))steps=fabs(dx);elsesteps=fabs(dy);xlncrement=float(dx)/float(steps);ylncrement=float(dy)/float(steps);setPixel(round(x),round(y));for(k=0;k3、));}}注意:(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该画线函数在回调函数myDraw()中调用执行;(2)代码中两次调用setPixel(int,int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。实际上它是一个画点的函数,所以用OpenGL的画点的方法进行改写,参考如下:voidsetPixel(GLintx,GLinty){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}(3)函数前的修饰符inline表示该函数是一个内联函数。内联函数在编4、译时直接用函数体代码替代该函数被调用的位置,加快程序执行的速度,与宏定义非常类似。二、实现Bresenham直线生成算法读懂课本第76页所给的如下代码,理解执行的原理:#include#include/*Bresenhamline-drawingprocedureforImI<10*/voidlineBres(intxO,intyO,intxEnd,intyEnd){intdx=fabs(xEnd-xO),dy=fabs(yEnd-yO);intp=2*dy-dx;inttwoDy=2*dy,twoDyMin5、usDx二2*(dy-dx);intx,y;/*Determinewhichendpointtouseasstartposition.*/if(xO>xEnd){x=xEnd;y=yEnd;xEnd=xO;}else{x=xO;y=yO;}setPixel(x,y);while(x6、用执行;(2)代码中两次调用setPixel(int,int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。三、实现中点圆算法读懂课本第85页所给的如下代码,理解执行的原理:#includeclassscrPt{public:GLintx,y;};voidsetPixel(GLintx,GLinty){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}voidcircleMidpoint(scrPtcircCtr,GLintradius){scrPtcircPt;GLint7、p=1-radius;//Initialvalueofmidpointparamete匚circPt.x=0;circPt.y=radius;//Setcoordinatesfortoppointofcircle.voidcirclePlotPoints(scrPt,scrPt);/*Plottheinitialpointineachcirclequadrant.*/circlePlotPoints(circCtr,circPt);/*Calculatenextpointsandplotineachoctant.*/while(circPt.x8、
3、));}}注意:(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该画线函数在回调函数myDraw()中调用执行;(2)代码中两次调用setPixel(int,int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。实际上它是一个画点的函数,所以用OpenGL的画点的方法进行改写,参考如下:voidsetPixel(GLintx,GLinty){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}(3)函数前的修饰符inline表示该函数是一个内联函数。内联函数在编
4、译时直接用函数体代码替代该函数被调用的位置,加快程序执行的速度,与宏定义非常类似。二、实现Bresenham直线生成算法读懂课本第76页所给的如下代码,理解执行的原理:#include#include/*Bresenhamline-drawingprocedureforImI<10*/voidlineBres(intxO,intyO,intxEnd,intyEnd){intdx=fabs(xEnd-xO),dy=fabs(yEnd-yO);intp=2*dy-dx;inttwoDy=2*dy,twoDyMin
5、usDx二2*(dy-dx);intx,y;/*Determinewhichendpointtouseasstartposition.*/if(xO>xEnd){x=xEnd;y=yEnd;xEnd=xO;}else{x=xO;y=yO;}setPixel(x,y);while(x6、用执行;(2)代码中两次调用setPixel(int,int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。三、实现中点圆算法读懂课本第85页所给的如下代码,理解执行的原理:#includeclassscrPt{public:GLintx,y;};voidsetPixel(GLintx,GLinty){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}voidcircleMidpoint(scrPtcircCtr,GLintradius){scrPtcircPt;GLint7、p=1-radius;//Initialvalueofmidpointparamete匚circPt.x=0;circPt.y=radius;//Setcoordinatesfortoppointofcircle.voidcirclePlotPoints(scrPt,scrPt);/*Plottheinitialpointineachcirclequadrant.*/circlePlotPoints(circCtr,circPt);/*Calculatenextpointsandplotineachoctant.*/while(circPt.x8、
6、用执行;(2)代码中两次调用setPixel(int,int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。三、实现中点圆算法读懂课本第85页所给的如下代码,理解执行的原理:#includeclassscrPt{public:GLintx,y;};voidsetPixel(GLintx,GLinty){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}voidcircleMidpoint(scrPtcircCtr,GLintradius){scrPtcircPt;GLint
7、p=1-radius;//Initialvalueofmidpointparamete匚circPt.x=0;circPt.y=radius;//Setcoordinatesfortoppointofcircle.voidcirclePlotPoints(scrPt,scrPt);/*Plottheinitialpointineachcirclequadrant.*/circlePlotPoints(circCtr,circPt);/*Calculatenextpointsandplotineachoctant.*/while(circPt.x
8、
此文档下载收益归作者所有