计算机图形学画圆实验报告.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机图形学画圆实验报告

洛阳理工学院实验报告用纸 计算机 系 B080504 班 姓名 刘 青 学号 成绩_______ 实 验 名 称 Bresenham画圆算法 同组人 日期 实验题目: 使用中心画圆法,结合圆的四对称特性实现圆绘制的演示程序。 实验目的: (1) 通过单击鼠标左键确定圆心,然后拖拽鼠标来确定圆的半径大小,在演示程序界面上显示圆心坐标和半径的长度; (2) 使用边长大于5像素的矩形来表示光栅显示设备上的像素以实现算法的演示效果; (3) 实现圆绘制过程的动画演示; (4) 演示程序可以显示圆绘制过程中每一步的运算结果; (5) 程序界面可以使用的语言及技术包括:C++(Qt,Win32 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); 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); } (2)画理想圆流程图如图-1: 图-1:画理想圆流程图 (3)中点画圆法图-2 中点画圆法当前象素与下一象素的候选者 如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)0,对于圆内的点F(x,y)0 。与中点画线法一样,构造判别式: d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2 若 d0,则应取P1为下一象素,而且再下一象素的判别式为: d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3 若d≥0,则应取P2为下一象素,而且下一象素的判别式为 d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5 我们这里讨论的第一个象素是(0,R),判别式d的初始值为: d0=F(1,R-0.5)=1.25-R中点画圆算法: MidPointCircle(int r int color) { int x,y; float d; x=0; y=r; d=1.25-r; circlepoints (x,y,color); while(x=y) { if(d0) d+=2*x+3; else { d+=2*(x-y)+5; y--; } x++; circlepoints (x,y,color); } } 为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 Bresenham画线法与中点画线法相似,,它通过每列象素中确定与理想直线最近的象素来进行直线的扫描的转换的。通过各行,各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的的象素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求对象。假设x列的象素已确定,其行下标为y。那么下一个象素的列坐标必为x+1。而行坐标要么不变,要么递增1。是否递增1取决于如图所示的误差项d的值。因为直线的起始点在象素中心,所以误差项d的初始值为0。X下标每增加1,d的值相应递增直线的斜率值,即d=d+k(k=y/x为直线斜率)。一旦d=1时,就把它减去,这样保证d始终在0、1之间。当d0.5时,直线与x+1垂直网络线交点最接近于当前象素(x,y)的右上方象素(x+1,y+1);而当d0.5时,更接近于象素(x+1,y),当d=0。5时,与上述二象素一样接近,约定取(x+1,y+1)。令e=d-0。5。则当e=0时,下一象素的y下标增加1,而当e〈0时,下一象素的y下标不增。E的初始值为-0.5. private Rectangle[] Bresenham_Circle(Point pcs, int rs) {

文档评论(0)

zhuwenmeijiale + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档