3种画圆算法的优劣分析Word格式.docx
《3种画圆算法的优劣分析Word格式.docx》由会员分享,可在线阅读,更多相关《3种画圆算法的优劣分析Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
像素为pi-1=(xi-1,yi-1),按顺时针方向生成圆时,为了最佳逼近该圆,根据圆弧的走向,下一点像素的取法只有两种可能的选择:
正右方像素和右下方像素,分别记为Hi和Li,Hi点特征:
(Xhi=xi,Yhi=yi-1),Li点特征:
(Xli=xi,YLi=yi-1-1)
(3)判断选择点
由圆的方程标准形式(x-xc)²
+(y-yc)²
=R²
可知,圆周上的实际位置的y值可由y²
=R²
-(xi-1+1)²
-xi²
得到,这个y值和整数坐标值yi–1之间的关系,用下式dh和dl表示。
dh=yi-1²
-y²
=yi-1²
-R²
+xi²
,
dl=y²
-(yi-1-1)²
=R²
-xi²
dh和dl的差用一个参数di来表示:
di=dh-dl=2xi²
+yi-1²
+(yi-1-1)²
-2R²
。
故构造函数如下:
D(p)=(x2+y2)-R2
di=D(Hi)+D(Li)=(xhi2+yhi2-R2)+(xli2+yli2-R2)
如果di为负,选择Hi点;
若di=0,则选择Hi或Li均可;
否则,选择Li点,再考虑Hi与Li全在圆内的情况,实际是沿Hi上方通过,则有dh<
0,dl>
0,且di<
0,故选择Hi点,对Hi与Li全在圆外情况,有dh>
0,dl<
0,且di>
0,故选择Li点。
各点坐标:
Pi-1(xi-1,yi-1),Hi(xi,yi-1),Li(xi,yi-1-1),Hi+1(xi+1,yi),Li+1(xi+1,yi-1-1);
起点坐标:
A(x0,y0),其中x0=0,y0=R,x1=x0+1=1。
(4)构造di与di+1的关系,不断选择点,直到生成第一个8分圆。
d1=D(H1)+D(L1)=(x12+y02-R2)+[x12+(y0-1)2-R2]=1+1+R2-2R+1-R=3-2R
di=D(Hi)+D(Li)=(xi2+yi-12-R2)+[xi2+(yi-1-1)2-R2]=2xi2+2yi-12-2yi-1-2R2+1
di+1=D(Hi+1)+D(Li+1)=(xi+12+yi2-R2)+[xi+12+(yi-1)2-R2]=
(2xi2+2yi-12-2yi-1-2R2+1)+4xi-1+6,(di<
0,取Hi,yi=yi-1),
(2xi2+2yi-12-2yi-1-2R2+1)+4(xi-1+yi-1)+10,(di≥0,取Li,yi=yi-1-1)。
2.2正负画圆法
(1)画出圆的1/4圆弧AB(第一象限,A点在Y轴上),利用对称性画出整个圆,在此仅考虑圆心在原点,半径为R的第一个4分圆。
(2)在AB上,设当前点像素为P(xp,yp),按顺时针方向生成圆弧式,为了最佳逼近圆弧,下一个像素只能是正右方的P1或正下方的P2两者之一,且P1(xp+1,yp),p2(xp,yp-1)。
如果当前点P在圆内,则下一点选择正右方的P1;
否则,选择正下方的P2.。
(3)为判别P1或P2,构造函数:
F(x,y)=x2+y2-R2。
理论上F(x,y)=0(点在圆上)。
又知F(x,y)>
0,点(x,y)
在圆外;
F(x,y)<
0,点(x,y)在圆内。
结合
(2)、(3)且将等号合并有
F(x,y)>
0,下一点选P2,
F(x,y)≤0,下一点选P1。
(4)确定再下一个像素.为减少计算量,构造F(x,y)
的递推公式:
P(xi,yi),P1(xi+1,yi),P2(xi,yi-1),
A(x1,y1)=A(0,R),xi+1=xi+1,
F(x1,y1)=x12+y12-R2=0,
F(xi,yi)=xi2+yi2-R2,
F(xi-1,yi-1)=xi-12+yi-12-R2,
若F(xi,yi)≤0,xi+1=xi+1,yi+1=yi,
故F(xi+1,yi+1)=(xi+1)2+yi2-R2=xi2+yi2-R2+2xi+1=F(xi,yi)+2xi+1,
若F(xi,yi)>
0时,xi+1=xi,yi+1=yi-1,
故F(xi+1,yi+1)=xi2+(yi-1)2-R2=xi2+yi2-R2-2yi+1=F(xi,yi)-2yi+1,再判断F(xi+1,yi+1)的符号,就可以确定其后续选择点。
2.3中点画圆法
(1)与Bresenham类似,只要画出圆上的1/8弧AB,根
据圆的对称性画出整个圆.仍考虑圆心在原点,半径为的第一个8分圆.
(2)在弧AB上设当前点像素为P(Xp,Yp),按顺时针方向生成圆弧时,为了最佳逼近圆弧,下一个像素只能是正右方的P1,或右下方的P2两者之一。
如图1所示。
图1中点画圆示意图
(3)为判别P1或P2,构造函数
F(X,Y)=X2+Y2-R2。
对于圆上的点,F(X,Y)=0;
对于圆外的点F(X,Y)>
0;
而对于圆内的点,F(X,Y)<
0。
假设M是P1和P2的中点,及M=(Xp+1,Yp-0.5),那么,当F(M)<
0时,M在圆内,这说明P1距离圆弧更近,应取P1作为下一个像素,而当F(M)>
0时,P2离圆弧更近,应取P2,当F(M)=0时,在P1与P2之中随便取一个即可,我们约定取P2,即
F(M)<
0,应取P1,F(M)≧0,应取P2
(4)为继续确定下一个像素,构造判别式:
d=F(M)=F(Xp+1,Yp-0.5)=(Xp+1)2+(Yp-0.5)2-R2
当d<
0时,P1成为确定的当前像素,而且P1的下一个像素只能是A’或B’,如图1所示,判别式为:
d=F(M1)=F(Xp+2,Yp-0.5)=(Xp+2)2+(Yp-0.5)2-R2=(Xp+1)2+2(Xp+1)+1+(Yp-0.5)2-R2=d+2Xp+3,
所以沿正方向,d的增量为2Xp+3。
而当d≧0时,P2成为当前像素,而且P2的下一个像素只能是B’huoC’,如图1所示,其判别式为:
d=F(M2)=F(Xp+2,Yp-1.5)=(Xp+2)2+(Yp-1.5)2-R2=(Xp+1)2+2(Xp+1)+1+(Yp-0.5)2-2(Yp-0.5)2+1-R2=d+2(Xp-Yp)+5,
所以沿着右下方向,d的增量为2(Xp-Yp)+5。
3、3种算法的分析比较
对于一个算法来说,其所用的空间和时间有时是两个对立的因素。
那么,空间和时间哪一个更重要呢?
本文的观点是:
对于图形学的基础算法来说,时间比空间更重要。
那么,如何比较图形学基础算法的速度呢?
本文对算法速度比较的观点是:
对图形学基础算法的比较应以分析算法的计算量为尺度。
该计算量应以算数运算及计算机操作的次数为单位。
Bresenham算法每生成一点的计算量为:
循环语句的一次比较操作;
d与0的一次比较操作;
更新d值的一次移位操作和2次加法及每当y减1时增加的一次减法.这个减法在8分圆中共出现R-R/
次,而8分圆共有R/
个点,因此平均到每点的减法为
-1,约0.4次,则每生成一点的平均计算量为:
2次比较,1次移位,2次加法及0.4次减法,共5.4次整数运算(不包含移动坐标值的加1及减1运算)。
同样地,分析正负画圆及中点画圆法后,可列表比较,见表1。
分析表1可知:
中点画圆算法速度最快.为了进一步进行比较,编程分别用这3种算法对圆心在(70,70),半径为50的圆画30000次,使用的是同一环境(P42.0),运行结果是:
Bresenham算法用了8.001秒,正负法算法用了11.00秒,中点算法用了7.02秒
圆生成算法(中点画圆、Bresenham画圆)
#include<
graphics.h>
math.h>
voidMidPointCircle(intr,intcolor);
voidCirclePoints(intx,inty,intcolor);
voidBresenhamCircle(intxc,intyc,intr,intcolor);
voidplot_cicle_point(intxc,intyc,intx,inty,intcolor);
main()
{
intgdriver=DETECT,gmode;
initgraph(&
gdriver,&
gmode,"
"
);
cleardevice();
setbkcolor
(2);
MidPointCircle(100,4);
getch();
BresenhamCircle(100,100,50,5);
closegraph();
}
voidMidPointCircle(intr,intcolor)
intx,y;
floatd;
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++;
voidCirclePoints(intx,inty,intcolor)
putpixel(x,y,color);
putpixel(y,x,color);
putpixel(-x,y,color);
putpixel(y,-x,color);
putpixel(x,-y,color);
putpixel(-y,x,color);
putpixel(-x,-y,color);
putpixel(-y,-x,color);
voidplot_circle_point(intxc,intyc,intx,inty,intcolor)
putpixel(xc+x,yc+y,color);
putpixel(xc-x,yc+y,color);
putpixel(xc+x,yc-y,color);
putpixel(xc-x,yc-y,color);
putpixel(xc+y,yc+x,color);
putpixel(xc-y,yc+x,color);
putpixel(xc+y,yc-x,color);
putpixel(xc-y,yc-x,color);
voidBresenhamCircle(intxc,intyc,intr,intcolor)
intx,y,d;
d=3-2*r;
y)
plot_circle_point(xc,yc,x,y,color);
d=d+4*x+6;
d=d+4*(x-y)+10;
if(x==y)
表1三种算法每生成一点所需的计算量的比较
Tab1Compareofthreealgorithmicinwhichdrawingonepoint
每次循环中各种运算次数
总和
画一个八分或四分圆的总运算次数
画每一点所需要的平均运算次数
比较
加法
移位
Bresenham法
2(d<
2
1
5
(R-R/
)×
6﹢(
-1)5=R-R/
5﹢
-1≈5.4
2(d≧0)
3
6
正负法
2R×
中点算法
2(f<
7﹢(
-1)×
5=2R-3R/
5(2R-3R/
)
/(R/
)≈4.8
2(f≧0)
7
4、结束语
通过实际的程序运行比较分析,结论是中点画圆法速度最快.就算法本身而言,该算法仍可在某些方面进行改进,如将其中的浮点运算改为整数运算等,执行速度将更快.生成直线和圆这类基础算法在编程时要被无数次的调用,可能每生成一帧画面就要被调用成百上千次,因此其执行速度是至关重要的.而这类基础算法的长度都很短,即使多用一些分支,多用一些变量和语句,一般来说只不过增加几十个语句.这样的空间增加与算法极重要的速度要求来比较是相对次要的因素,因此在开发图形学的基础算法时,如果有可能提高算法的速度,应不惜多占一些存储空间.
参考文献
【1】孙家广,计算机图形学[M]第三版,北京:
清华大学出版社,1999。
【2】刘勇奎,计算机图形学的基础算法[M],北京:
科学出版社,2002。
【3】刘乃琪,计算机图形技术基础[M],西安:
电子科技大学出版社,1994。