《计算机图形学画圆实验报告》由会员分享,可在线阅读,更多相关《计算机图形学画圆实验报告(13页珍藏版)》请在人人文库网上搜索。
1、洛阳理工学院实验报告用纸 _______ 成绩 B08050427 青 学号 系 B080504 班 姓名 刘 计算机实 验称名 画圆算法Bresenham 同组人 日期 实验题目: 使用中心画圆法,结合圆的四对称特性实现圆绘制的演示程序。 实验目的: (1) 通过单击鼠标左键确定圆心,然后拖拽鼠标来确定圆的半径大小,在演示程序界面上显示圆心坐标和半径的长度; (2) 使用边长大于5像素的矩形来表示光栅显示设备上的像素以实现算法的演示效果; (3) 实现圆绘制过程的动画演示; (4) 演示程序可以显示圆绘制过程中每一步的运算结果; (5) 程序界面可以使用的语言及技术包括:C+(Qt,Win3。
2、2 API)、VB/C#(GDI+)或Java(Swing),界面要求简单、整洁,可以充分实现要求的功能。 实验内容: (一) 实验分析(C#语言GDI+实现) (1)圆的特性 圆被定义为到给定中心位置(xc,yc)距离为r的点集。圆心位于原点的圆有四条对称轴x=0,y=0,x=y和x=-y。若已知圆弧上一点(x,y),可以得到其关于四条对称轴的其它7个点,这种性质称为圆的八对称性。因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。 显示圆弧上的八个对称点的算法: void CirclePoints(int x,int y,int color) drawpixel(x,y,color。
3、); drawpixel(y,x,color); drawpixel(-x,y,color); drawpixel(y,-x,color); drawpixel(x,-y,color); drawpixel(-y,x,color); drawpixel(-x,-y,color); drawpixel(-y,-x,color); 图-1:画理想圆流程图1 / 7 -1(2)画理想圆流程图如图:)中点画圆法(3图-2 中点画圆法当前象素与下一象素的候选者 2/ 7 ,对,则对于圆上的点有F(x,y)=0如果我们构造函数 F(x,y)=x2+y2-R2。与中点画线法一样,构,对于圆内的点F(x,y)。
4、0 造判别式:d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2 为下一象素,而且再下一象素的判别式为:P1若 d0.5一旦d=1时,就把它减去,这样保证d始终在0;)的右上方象素(x+1,y+1)x,y线与x+1垂直网络线交点最接近于当前象素(时,与上述二象素一样d=0。5d=0接近,约定取(x+1,y+1)-0.5. 的初始值为0时,下一象素的y下标不增。E1增加,而当e (二)实验设计 :画填充点流程图,如图-3 画理想圆, 记录圆心坐标,计算半径大小,并记录 是否开始填充 是 否 初始化计数器、标志变量,设置最大计数值 m画圆算法调用Bresenha 。
5、填充标记是否为真 是 否 计数变量小于最大计数值(While) 计算需要填充坐标数组的 个坐标temp前 个坐temp填充计算出来的 标点temp + 1 循环变量 NS图圆的像素填充过程:图-3 / 4 7 (三)代码实现 画圆算法:Bresenham rs) pcs, intPointprivate Rectangle Bresenham_Circle( (); dpoint = new List List(); de = x, y, d, d1, d2, direction; int x = 0; y = rs; d = 2 * (1 - rs); (); Rectangle List 。
6、lr = new (y -1) while (pcs.X + x) * 20 - 10, (pcs.Y - y) * 20 - 10, 20, 20); Rectanglenew lr.Add(pcs.X - x) * 20 - 10, (pcs.Y - y) * 20 - 10, 20, 20); Rectanglenew lr.Add(pcs.X - x) * 20 - 10, (pcs.Y + y) * 20 - 10, 20, 20); Rectanglenew lr.Add(pcs.X + x) * 20 - 10, (pcs.Y + y) * 20 - 10, 20, 20); R。
7、ectangle lr.Add(new(pcs.X + x, pcs.Y - y); Point dpoint.Add(new de.Add(d); (d 0) ifelse d2 = 2 * (d - x) - 1; (d2 = 0) direction = 2; if direction = 3; else else direction = 3; (direction) switch 1: case x+; d += 2 * x + 1; ; break 2: case / 5 7 x+; y-; d += 2 * (x - y + 1); ; break 3: case y-; d +=。
8、 (-2) * y + 1; ; break i = 0; int lr.Count; Rectanglenew Rectangle frs = lr) inRectangle r foreach ( frsi = r; +i; i = 0; dpoint.Count; Point dps = new dpoint) p in foreach (Point dpsi = p; +i; i = 0; dpoint.Count; double des = new de) doub inforeach (double desi = doub; +i; frs; return 实验总结:画圆算法是目前应用最广泛的一种圆生成算法。他的计算均为整数运算,算法Bresenham 思想与中心点画圆法类似,但计算精度比中心点画圆法高,因而生成的圆或圆弧的质量好。画圆算法也存在因舍入的误差而导致计算的点的坐标不准确,可Bresenham实验过程中, 能会一个区间内,去多个不同的坐标值的现象。/ 6 7 附录 图-4 Bresenham画圆算法最终效果图 7 / 7。