C语言快速画直线和画圆的代码

具体算法的原理我没有深入研究,总之用来快速画直线和画圆是目前很成熟的算法,拿来就用了^-^ 整个算法过程中只用了整数加减和移位,非常适用于运算能力有限的单片机系统。 以下代码只需要把SetPixel替换为目标平台的画点函数就可以了。

//-------------------------------------------------------------------------------------------------
//画直线(x1,y1为起点坐标,x2,y2为终点坐标,绘制的直线包括起点,但不包括终点)
void DrawLine(int x1, int y1, int x2, int y2, int color)
{
	int di;
	int dx;
	int dy;
	int gx;
	int gy;
	di = 0;
	gx = (x2 > x1) ? 1 : -1;
	gy = (y2 > y1) ? 1 : -1;
	dx = (x2 - x1) * gx + 1;
	dy = (y2 - y1) * gy + 1;
	if(dx >= dy)
	{
		for(/*x2 += gx*/; x1 != x2; x1 += gx)
		{
			di += dy;
			if(di <= dx)
			{
				SetPixel(dc, x1, y1, color);
				continue;
			}
			while((di > dx) && (y1 != y2))
			{
				di -= dx;
				y1 += gy;
				SetPixel(dc, x1, y1, color);
			}
		}
	}
	else
	{
		for(/*y2 += gw*/; y1 != y2; y1 += gy)
		{
			di += dx;
			if(di <= dy)
			{
				SetPixel(dc, x1, y1, color);
				continue;
			}
			while((di > dy) && (x1 != x2))
			{
				di -= dy;
				x1 += gx;
				SetPixel(dc, x1, y1, color);
			}
		}
	}
}

//-------------------------------------------------------------------------------------------------
//画圆(x,y为圆心坐标,r为圆的半径,圆心的真实物理位置是x,y这个像素的左上角)
void DrawCircle(int x, int y, int r, int color)
{
	int  xi;
	int  yi;
	int  di;
	di = 0 - (r >> 1);
	xi = 0;
	yi = r;
	while(yi >= xi)
	{
		SetPixel(x + xi - 1, y + yi - 1, color);
		SetPixel(x + yi - 1, y + xi - 1, color);
		SetPixel(x - xi, y + yi - 1, color);
		SetPixel(x - yi, y + xi - 1, color);
		SetPixel(x - xi, y - yi, color);
		SetPixel(x - yi, y - xi, color);
		SetPixel(x + xi - 1, y - yi, color);
		SetPixel(x + yi - 1, y - xi, color);
		xi++;
		if (di < 0)
		{
			di += xi;
		}
		else
		{
			yi--;
			di += xi - yi;
		}
	}
}

已知问题:画圆时会有一些像素点被重复绘制。