Advertisement

光栅图形学-中点画圆法

阅读量:

圆定义为所有与中心点(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)

还没有任何评论哟~