3种画圆算法的优劣分析Word格式.docx

上传人:b****3 文档编号:17562349 上传时间:2022-12-07 格式:DOCX 页数:8 大小:27.52KB
下载 相关 举报
3种画圆算法的优劣分析Word格式.docx_第1页
第1页 / 共8页
3种画圆算法的优劣分析Word格式.docx_第2页
第2页 / 共8页
3种画圆算法的优劣分析Word格式.docx_第3页
第3页 / 共8页
3种画圆算法的优劣分析Word格式.docx_第4页
第4页 / 共8页
3种画圆算法的优劣分析Word格式.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

3种画圆算法的优劣分析Word格式.docx

《3种画圆算法的优劣分析Word格式.docx》由会员分享,可在线阅读,更多相关《3种画圆算法的优劣分析Word格式.docx(8页珍藏版)》请在冰豆网上搜索。

3种画圆算法的优劣分析Word格式.docx

像素为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。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1