void WholeCircle(CDC *pDC, int CentX, int CentY, int x, int y, long color)
{
pDC->SetPixel(CentX + x, CentY + y, color); pDC->SetPixel(CentX - x, CentY + y, color);
pDC->SetPixel(CentX + x, CentY - y, color); pDC->SetPixel(CentX - x, CentY - y, color);
pDC->SetPixel(CentX + y, CentY + x, color); pDC->SetPixel(CentX - y, CentY + x, color);
pDC->SetPixel(CentX + y, CentY - x, color); pDC->SetPixel(CentX - y, CentY - x, color);
}
void drawCircle(CDC *pDC, int CentX, int CentY, int r, long color)
{
int d = - r/2;
int x = 0;
int y = r;
WholeCircle(pDC, CentX, CentY, x, y, color);
while(x < y)
{
if(d >= 0)
{
d += 2 * (1 - y);
y--;
}
d += 2 * x + 3;
x++;
WholeCircle(pDC, CentX, CentY, x, y, color);
}
}
void CCircleView::OnDraw(CDC* pDC)
{
CCircleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
drawCircle(pDC, 200, 200, 100, RGB(255, 0, 0));
// TODO: add draw code for native data here
}
精度要求不高的情况下,可进行如下化简:
void drawCircle(CDC *pDC, int CentX, int CentY, int r, long color)
{
int d = -r/2;
int x = 0;
int y = r;
WholeCircle(pDC, CentX, CentY, x, y, color);
while(x < y)
{
if(d >= 0)
{
d -= y;
y--;
}
d += x;
x++;
WholeCircle(pDC, CentX, CentY, x, y, color);
}
}