光栅图形学-中点画圆法
圆被定义为到中心位置(Xc,Yc)的距离为r的点集,圆心位于原点的圆有4条对称轴x=0,y=0,x=y和x=-y,若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他7个点,这种性质称为八对称性,因此,只要扫描转换1/8圆弧,就可以用八对称性求出整个圆弧的像素集。
中点画圆法:构造函数F(x,y) = x^2 + y^2 - R^2,对于圆上的点,F(X,Y)=0,对于圆外的点,F(X,Y)>0;对于圆内的点,F(X<Y)<0.与中点画线法一样,构造判别式。
d=F(M)=F(Xp+1, Yp-0.5)=(Xp+1)^2 + (Yp-0.5)^2 - R^2.
若d<0,取P1(Xp,Yp),否则取P2(Xp,Yp-1).
运行结果(可能不太显眼):
实现代码:
从第一个像素(0,R)开始画。
void CDrawView::MiddleDrawcircle(int x0,int y0,int r,int color)
{
//中点画圆算法
//d>0 像素点在圆外 d<0 像素点在圆内
CClientDC dc(this);
int x,y;
float d;
x=0; //初始点
y=r; //从圆上一点开始画
d=1.25-r; //初始的d值
dc.SetPixel(x+x0,y+y0,color); //分为八个对称点
dc.SetPixel(-x+x0,y+y0,color);
dc.SetPixel(x+x0,-y+y0,color);
dc.SetPixel(-x+x0,-y+y0,color);
dc.SetPixel(y+x0,x+y0,color);
dc.SetPixel(-y+x0,x+y0,color);
dc.SetPixel(y+x0,-x+y0,color);
dc.SetPixel(-y+x0,-x+y0,color);
while(x<=y)
{
if(d>0) //中点在上面
{
d+=2*(x-y)+5; //修改d
y--;
}
else
d+=2*x+3; //d加上d的增量
x++;
dc.SetPixel(x+x0,y+y0,color); //分为八个对称点
dc.SetPixel(-x+x0,y+y0,color);
dc.SetPixel(x+x0,-y+y0,color);
dc.SetPixel(-x+x0,-y+y0,color);
dc.SetPixel(y+x0,x+y0,color);
dc.SetPixel(-y+x0,x+y0,color);
dc.SetPixel(y+x0,-x+y0,color);
dc.SetPixel(-y+x0,-x+y0,color);
}
}