LCD圆弧绘制算法~基于逐点比较算法,入口参数:弧线起点、终点(逆时针方向)、圆心


以下分不同象限分别给出算法,便于各位理解。area1即为第一象限,依次类推。

/************************圆弧插补算法
    液晶坐标系统如下:
    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);
    
    注意:调用弧线的起始和终点按逆时针方向
                                                          
******************************************/
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--;
        }    
    }    

}

如图中lcd的液晶上的弧线即通过该算法绘制


posted @ 2015-04-13 12:14  信雪神话  阅读(415)  评论(0编辑  收藏  举报