圆形的生成
圆形的扫描转换
在屏幕像素点阵中确定一组最佳逼近于圆的像素点,并用指定的颜色显示出来。
由于圆具有对称性,在进行扫描转换时,只需迭代生成八分之一圆的最佳像素逼近点,圆的其他部分通过简单的坐标对称就可以直接得到。
中点画圆
void MIDPOINT_Circle(CDC *pDc,CPoint cPt ,int R,COLORREF crColor)
{
int x,y,d;
x=0;
y=R;
d=5-4*R;
pDc->SetPixel(cPt.x+x,cPt.y+y,crColor);
pDc->SetPixel(cPt.x+x,cPt.y-y,crColor);
pDc->SetPixel(cPt.x+y,cPt.y+x,crColor);
pDc->SetPixel(cPt.x-y,cPt.y+x,crColor);
while(x<=y)
{
if (d>=0)
{
x+=1;
y-=1;
d+=8*(x-y)+20;
}
else
{
x+=1;
d+=8*x+12;
}
pDc->SetPixel(cPt.x+x,cPt.y+y,crColor);
pDc->SetPixel(cPt.x+x,cPt.y-y,crColor);
pDc->SetPixel(cPt.x-x,cPt.y+y,crColor);
pDc->SetPixel(cPt.x-x,cPt.y-y,crColor);
pDc->SetPixel(cPt.x+y,cPt.y+x,crColor);
pDc->SetPixel(cPt.x-y,cPt.y+x,crColor);
pDc->SetPixel(cPt.x+y,cPt.y-x,crColor);
pDc->SetPixel(cPt.x-y,cPt.y-x,crColor);
}
}
Bresenham画圆
void Bresenham_Circle(CDC *pDc,CPoint cPt ,int R,COLORREF crColor)
{
int x,y,p;
x=0;
y=R;
p=3-2*R;
pDc->SetPixel(cPt.x+x,cPt.y+y,crColor);
pDc->SetPixel(cPt.x+x,cPt.y-y,crColor);
pDc->SetPixel(cPt.x+y,cPt.y+x,crColor);
pDc->SetPixel(cPt.x-y,cPt.y+x,crColor);
while(x<=y)
{
if (p>=0)
{
x+=1;
y-=1;
p+=4*(x-y)+10;
}
else
{
x+=1;
p+=4*x+6;
}
pDc->SetPixel(cPt.x+x,cPt.y+y,crColor);
pDc->SetPixel(cPt.x+x,cPt.y-y,crColor);
pDc->SetPixel(cPt.x-x,cPt.y+y,crColor);
pDc->SetPixel(cPt.x-x,cPt.y-y,crColor);
pDc->SetPixel(cPt.x+y,cPt.y+x,crColor);
pDc->SetPixel(cPt.x-y,cPt.y+x,crColor);
pDc->SetPixel(cPt.x+y,cPt.y-x,crColor);
pDc->SetPixel(cPt.x-y,cPt.y-x,crColor);
}
}
结果显示