预览加载中,请您耐心等待几秒...
1/3
2/3
3/3

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

2.2.3正负算法生成圆正负法是利用平面曲线将平面划分成正负区域,对当前点产生的圆函数进行符号判别,利用负反馈调整以决定下一个点的产生来直接生成圆弧。HYPERLINK"http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-2-3-a.htm"一、正负画圆算法描述设要显示圆的圆心在原点(0,0),半径为R,初始点的坐标为(0,R),顺时针生成八分之一圆,令:F(x,y)=x2+y2-R2则圆的方程为:F(x,y)=0(2-27)当点(x,y)在圆内时,则F(x,y)<0;当点(x,y)在圆外时,则F(x,y)>0;当点(x,y)在圆上时,则F(x,y)=0;HYPERLINK"http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-2-3-a.htm"二、正负画圆算法思想现以下图的AB弧为例,来说明正负画圆法(顺时针生成圆)。假设当前点为Pi(xi,yi),取下一个点Pi+1(xi+1,yi+1)的原则是:1、当F(xi,yi)≤0时:取xi+1=xi+1,yi+1=yi。即向右走一步,从圆内走向圆外。对应图(a)中的从Pi到Pi+1。2、当F(xi,yi)>0时:取xi+1=xi,yi+1=yi-1。即向下走一步,从圆外走向圆内。对应图(b)中的从Pi到Pi+1。由于向圆内或向圆外走取决于F(xi,yi)的正负,因此称为正负法。下面分两种情况求出F(xi,yi)的递推公式:(1)当F(xi,yi)≤0时,向右走,取xi+1=xi+1,yi+1=yi,则F(xi+1,yi+1)=F(xi+1,yi)=(xi+1)2+yi2-R2=(xi2+yi2-R2)+2xi+1=F(xi,yi)+2xi+1(2-28)(2)当F(xi,yi)>0时,向下走,取xi+1=xi,yi+1=yi-1,则F(xi+1,yi+1)=F(xi,yi-1)=xi2+(yi-1)2-R2=(xi2+yi2-R2)-2yi+1=F(xi,yi)-2yi+1(2-29)初始时,x=0,y=R,故F(0,R)=(02+R2)-R2=0(2-30)公式(2-28)、(2-29)和(2-30)就构成正负画圆算法的核心。给象素坐标(x,y)及F赋初始值后,进入循环画点;画点后,根据F的符号进行F值的递推和下一个点的获取,直到x>y为止。同前面介绍的一样,利用圆的八分对称性,循环一次,画八个点。HYPERLINK"http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-2-3-a.htm"三、正负画圆算法实现注意:初值不同、圆的生成方向不同时,当前点和下一个点的获取原则是不同的,见下图。例如,初始点(R,0),逆时针生成圆,从图(b)可知:若当前点Pi在圆内,则下一点Pi+1(xi,yi+1),即向上走一步;若当前点Pi在圆外,则下一点Pi+1(xi-1,yi),即向左走一步;(a)顺时针生成圆(b)逆时针生成圆HYPERLINK"http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-2-3-a.htm"四、正负画圆算法演示HYPERLINK"http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-2-3-a.htm"五、正负画圆算法特点物理意义清楚,程序中只含整数运算,因此算法速度快。HYPERLINK"http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-2-3-a.htm"六、正负画圆算法程序//顺时针生成圆voidPNARC(intx0,inty0,intr,intcolor){intx=0,y=r,f=0;while(x<=y){putdot(x0,y0,x,y,color);if(f<=0){f=f+2*x+1;x++;}else{f=f-2*y+1;y--;}}}