光栅图形学-中点画圆法

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82916811

圆被定义为到中心位置(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);
	}
} 

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/82916811