1、Bresenham算法画圆并填充实验报告09009202陶园Bresenham算法画圆并填充实验报告 09009202 陶园计算机图形学实验报告Bresenham算法画圆并填充 09009202 陶园 计算机图形学实验报告 实验二 Bresenham算法画圆并填充 学号: 09009202 姓名:陶园 成绩: 东南大学计算机科学与工程学院 二一一年十一月 计算机图形学实验报告Bresenham算法画圆并填充 09009202 陶园 一( 实验题目 Bresenham算法画圆并填充 二( 算法思想 1. 首先,真实的线条是连续的,但是计算机中的线条是离散的,是由很多点组成的,那么画线的重点就是如
2、何高效地找到这些离散的点来更好地画出想要的图形。 2. 实验要求用Bresenham算法实现画圆。那么首先先要了解Bresenham算法是一种什么算法。经过查阅,我找到Bresenham直线算法和画圆算法。直线是圆的基础。 Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。 Bresenham画圆算法又称中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一
3、些加、减和移位运算就可以计算出来。为了简便起见,考虑一个圆 心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。 计算机图形学实验报告Bresenham算法画圆并填充 09009202 陶园 Bresenham直线算法流程图 圆的八对称性 计算机图形学实验报告Bresenham算法画圆并填充 09009202 陶园 所以,只需要知道圆上的一个点的坐标 (x, y) ,利用八对称性,就能得到另外七个对称点的坐标。和直线算法类似,Bresenham画圆算法也是用一系列离散的点来近似描述一个圆。 Bresenham画圆算法的流程图 计算机图形学实验报告Bresenham算法
4、画圆并填充 09009202 陶园 三( 源代码 #include stdlib.h #include math.h #include /按坐标画点 void draw(GLint xCoord, GLint yCoord) glBegin(GL_POINTS);/以点的形式 glVertex2i(xCoord, yCoord);/在,xCoord, yCoord,坐标下画点 glEnd(); glFlush();/强制刷新 void Circle(GLint x,GLint y) int a=abs(x);/将x的绝对值赋给a int b=abs(y);/将y的绝对值赋给b int c=a*
5、-1;/使c=a的相反数 int d=b*-1;/使d=b的相反数 draw(x, y); draw(y, x); draw(-x, y); draw(y, -x); draw(x, -y); draw(-y, x); draw (-x, -y); draw(-y, -x);/按照圆的对称性以圆心为对称点将四个象限的圆周画出 for(int i=c;i=a;i+) for(int j=d;j=0) Circle(x,y); if(d 0) d1 = 2* (d+ y) -1; if(d1 0) d2 = 2*(d-x)-1; if(d2 = 0) direct = 2; else direct
6、 = 3; else direct = 2; switch(direct) case 1: x+; d+=2*x + 1; break; case 2: x+; y-; d+=2*(x-y+1) + 1; break; case 3: y-; d+=-2*y + 1; break; void RenderScene(void) 计算机图形学实验报告Bresenham算法画圆并填充 09009202 陶园 BresenhamCircle(50);/主函数调用 /当窗口大小改变时由GLUT函数调用 void ChangeSize(GLsizei width, GLsizei Height) GLf
7、loat aspectRatio; if (Height = 0) Height = 1; glViewport(0, 0, width, Height);/指定视口矩形左下角 glMatrixMode(GL_PROJECTION);/指定当前矩阵,对投影矩阵应用随后的矩阵操glLoadIdentity();/ 装载单位矩阵 aspectRatio = (GLfloat)width / (GLfloat) Height; if (width = Height) glOrtho(-100.0, 100.0, -100.0 / aspectRatio, 100.0 / aspectRatio, 1
8、.0, -1.0); else glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0); glMatrixMode(GL_MODELVIEW);/指定当前矩阵,对模型视景矩阵堆栈应用随后的矩阵操作glLoadIdentity();/ 装载单位矩阵 /主程序入口 void main(void) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);/设置初始显示模式,指定单缓存窗口,指定 RGB 颜色模式的窗口 glutCreateWindow(圆);/创建窗口,窗
9、口名称为“圆” glutDisplayFunc(RenderScene);/进行画图 glutReshapeFunc(ChangeSize);/重画回调函数 glutMainLoop();/进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环 计算机图形学实验报告Bresenham算法画圆并填充 09009202 陶园 四(结果截屏 五(出现问题及解决方案 1.对于如何填充整个圆一开始没有好的方法,后来决定每画一个点,就将该横坐标的所有纵坐标点画出,从下到上,整个填充圆从中间到两边形成。 2,一开始画圆时出现的都是白色,没有圆,后来发现是因为没有在glEnd()之后加glFlush()这个函数。加上之后就可以显示出圆了。 3.对于如何将这个圆显示出来,还参考了其他画图用的函数,但是每项功能都标注出来了。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1