圆弧的生成算法

//基于八对称点算法
MidPointCircle(int r,int color)
{
int x,y;
int e;
x=0;y=r;e=1-r;
CirclePoints(x,y,color);
while(x<=y)
{
if(e<0)
e+=2*x+3;
else
{
e+=2*(x-y)+5;
y--;
}
x++;
CirclePoints(x,y,color);
}
}
//中点画圆法
//圆的生成算法,没有浮点运算,效率较快,至今仍使用

void MidPointEllipse(int xc,int yc,int a,int b,int color)
{
int aa=a*a,bb=b*b;
int twoaa=2*aa,twobb=2*bb;
int x=0,y=b;
int d;
int dx=0;
int dy=twoaa*y;
d=int(bb+aa*(-b+0.25)+0.5);
SetPixel(xc+x,yc+y,color);
SetPixel(xc+x,yc-y,color);
SetPixel(xc-x,yc+y,color);
SetPixel(xc-x,yc-y,color);
while(dx<dy) //绘制椭圆(第一象限内)上圆周部分
{
x++;
dx+=twobb;
if(d<0)
d+=bb+dx;
else
{
dy-=twoaa;
d+=bb+dx-dy;
y--;
}
SetPixel(xc+x,yc+y,color);
SetPixel(xc+x,yc-y,color);
SetPixel(xc-x,yc+y,color);
SetPixel(xc-x,yc-y,color);
}
d=int(bb*(x+0.5)*(x+0.5)++aa*(y-1)*(y-1)-aa*bb+0.5);
while(y>0) //绘制椭圆(第一象限)下圆周部分
{
y-;
dy-=twoaa;
if(d>0)
d+=aa-dy;
else
{
x++;
dx+=twobb;
d+=aa-dy+dx;
}
SetPixel(xc+x,yc+y,color);
SetPixel(xc+x,yc-y,color);
SetPixel(xc-x,yc+y,color);
SetPixel(xc-x,yc-y,color);
}
//椭圆(第一象限)生成算法,虽然有取整运算,但是总体上仍为整数运算
//圆弧绘制思想:1.先进行划分,选择其中一部分去绘制2.在划分的基础上,选定一个“中点”3,通过判断中点附近的点与函数的距离,决定绘制最近的点

猜你喜欢

转载自blog.csdn.net/caoyang_he/article/details/80368191