光栅图形学-中点画圆法
发布时间
阅读量:
阅读量
圆定义为所有与中心点(Xc,Yc)距离等于半径r的所有点的集合;当圆心位于坐标原点时,则存在四条对称轴:x=0、y=0以及x=y和x=-y;已知圆弧上的某一点坐标(x,y),则可以通过对称性得到另外七个对应点;这种几何特性被称为八重对称性;因此,在扫描转换1/8范围内的圆弧后,其余7/8范围内的像素分布可以通过八重对称性规律自动确定。
中点画圆法:首先定义函数F(x,y) = x² + y² - R²,则当点(x,y)位于圆周上时有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);
}
}
全部评论 (0)
还没有任何评论哟~
