作为做技术的怎么一点分享的精神都没有。,,自己解决了都不传代码。。。我这两天刚解决。。。我给大家传!!!
/************************圆弧插补算法
液晶坐标系统如下:
0------->x
|
|
|
y
调用实例如下:
arc_chabu_area1(120,340,120,275,180,340);
arc_chabu_area2(415,145,390,110,415,100);
arc_chabu_area3(250,225,250,275,200,225);
arc_chabu_area4(250,225,300,225,250,275);
注意:调用弧线的起始和终点按逆时针方向;
参数说明:
x0,y0 圆心坐标
x1,y1 起点坐标
x2,y2 终点坐标
LCD_DrawLine(xi,yi,x,y,5);中的数字5为线宽设置。
******************************************/
void arc_chabu_area1(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
{
u16 x,y,xi,yi;
u8 e;
x=xi=x2;
y=yi=y2;
POINT_COLOR=GRAY;
e=abs(x2-x1)+abs(y2-y1);
while(e!=0)
{
if(fi1>=0)
{
x=xi-1;
fi1=fi1+2*(x0-xi)+1;
LCD_DrawLine(xi,yi,x,y,5);
xi=x;
e--;
}
else
{
y=yi-1;
fi1=fi1+2*(y0-yi)+1;
LCD_DrawLine(xi,yi,x,y,5);
yi=y;
e--;
}
}
}
void arc_chabu_area2(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
{
u16 x,y,xi,yi;
u8 e;
x=xi=x2;
y=yi=y2;
e=abs(x2-x1)+abs(y2-y1);
while(e!=0)
{
if(fi2>=0)
{
y=yi+1;
fi2=fi2+2*(yi-y0)+1;
LCD_DrawLine(xi,yi,x,y,5);
yi=y;
e--;
}
else
{
x=xi-1;
fi2=fi2+2*(x0-xi)+1;
LCD_DrawLine(xi,yi,x,y,5);
xi=x;
e--;
}
}
}
void arc_chabu_area3(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
{
u16 x,y,xi,yi;
u8 e;
x=xi=x2;
y=yi=y2;
e=abs(x2-x1)+abs(y2-y1);
while(e!=0)
{
if(fi3>=0)
{
x=xi+1;
fi3=fi3+2*(xi-x0)+1;
LCD_DrawLine(xi,yi,x,y,5);
xi=x;
e--;
}
else
{
y=yi+1;
fi3=fi3+2*(yi-y0)+1;
LCD_DrawLine(xi,yi,x,y,5);
yi=y;
e--;
}
}
}
void arc_chabu_area4(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
{
u16 x,y,xi,yi;
u8 e;
x=xi=x2;
y=yi=y2;
e=abs(x2-x1)+abs(y2-y1);
while(e!=0)
{
if(fi4>=0)
{
y=yi-1;
fi4=fi4+2*(y0-yi)+1;
LCD_DrawLine(xi,yi,x,y,5);
yi=y;
e--;
}
else
{
x=xi+1;
fi4=fi4+2*(xi-x0)+1;
LCD_DrawLine(xi,yi,x,y,5);
xi=x;
e--;
}
}
}
|