计算机图形学画圆实验报告
洛阳理工学院实验报告用纸
计算机 系 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
若 d<0,则应取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(d<0)
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之间。当d>0.5时,直线与x+1垂直网络线交点最接近于当前象素(x,y)的右上方象素(x+1,y+1);而当d<0.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)
{