一 圆的扫描转换
一个圆可以分为等价的八份,若其中一份的点的坐标是(x,y),那么另外七份分别是(y,x),(-x,y),(-x,-y),(x,-y),(y,-x),(-y,-x),(y,-x)
1 中心画圆法(讨论 (0,R)到(√2R,√2R))
构造函数F(x,y)=x^2+y^2-R^2 对于园外的点来说 F(x,y)>0 对于园内的点来说,F(x,y)<0
判别式:
d=F(M)=(x+1)^2+(y-0.5)^2-R^2
d<0
d=F(x+2,y-0.5)=(x+2)^2+(y-0.5)^2+R^2=d+2x+3
d>0
d=F(x+2,y-1.5)=(x+2)^2+(y-1.5)^2+R^2=d+2(x-y)+5
d0=F(1,R-0.5)=1.25-r
MindpointCircle(r,color)
int r,color;
{
int x,y;
float d;
x=0;y=r;d=1.25-r;
while(x<y)
{
if(d>0)
{
d=d+x*2+3;
x++;
}
else
{
d=d+2*(x-y)+5;
x++;
y--;
}
drawpixel(x,y,color);
}
}
2 Bresenham 画圆算法
Breseham_Circle(r,color)
int r,color;
{
int x,y,delta1,delta2,delta,direction;
x=0;y=r;
delta=2*(1-r);
while(y>=0)
{
drawpixal(x,y,color);
if(delta<0)
{
delta1=2*(delta+y)-1;
if(delta1<0) direction=1;
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2<=0) direction=2;
else direction=3
}
else
direction=2;
switch(direction)
{
case 1 : x++;
delta+=2*x+1;break;
case 2 :x++;y--;
delta+=2*(x-y+1);
break;
case 3 :y--;
delta+=(-2*y+1)
break;
}
}
}