[mw_shl_code=c,true]这是我以前自己写的一个, 圆和线的画法是 Bresenham算法 , 仅供参考
//
typedef struct _MCIRCLE
{
MPoint center; //中心坐标
u16 r; // 半径
Color brushcolor; //填充颜色
Color pencolor; //边线颜色
}MCircle, *pMCircle;
//c 圆的结构体 brush :是否填充
void LCD_DrawCircle(pMCircle c, bool brush)
{
int a,b;
MPoint p;
MLine L;
u16 x0 = c->center.x;
u16 y0 = c->center.y;
int di;
L.color = c->brushcolor ;
a=0; b=c->r;
di=3-(c->r<<1); //判断下个点位置的标志
while(a<=b)
{
p.x = x0+a; p.y = y0+b ; LCD_DrawPoint(p,c->pencolor);
p.x = x0+a; p.y = y0-b ; LCD_DrawPoint(p,c->pencolor);
p.x = x0-a; p.y = y0+b ; LCD_DrawPoint(p,c->pencolor);
p.x = x0-a; p.y = y0-b ; LCD_DrawPoint(p,c->pencolor);
p.x = x0+b; p.y = y0+a ; LCD_DrawPoint(p,c->pencolor);
p.x = x0+b; p.y = y0-a ; LCD_DrawPoint(p,c->pencolor);
p.x = x0-b; p.y = y0+a ; LCD_DrawPoint(p,c->pencolor);
p.x = x0-b; p.y = y0-a ; LCD_DrawPoint(p,c->pencolor);
if(brush)
{
L.start.x = x0-a+1; L.start.y = y0-b+1; L.end.x = x0+a-1; L.end.y = y0-b+1; LCD_DrawLine(L);
L.start.x = x0-a+1; L.start.y = y0+b-1; L.end.x = x0+a-1; L.end.y = y0+b-1; LCD_DrawLine(L);
L.start.x = x0-b+1; L.start.y = y0-a+1; L.end.x = x0+b-1; L.end.y = y0-a+1; LCD_DrawLine(L);
L.start.x = x0-b+1; L.start.y = y0+a-1; L.end.x = x0+b-1; L.end.y = y0+a-1; LCD_DrawLine(L);
}
a++;
if(di<0)
di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
p.x = x0+a; p.y = y0+b ;
LCD_DrawPoint(p,c->pencolor);
}
}[/mw_shl_code]
|