LCD_TEST.C之Glib_Line函数简化

看LCD_TEST.C的时候看到这个函数的,一个画线的函数一百来行,好像总共分了八种情况来处理,实在感觉冗余,就动手自己写了。


void Glib_Line(int x1,int y1,int x2,int y2,int color)
{
    int dx=x2-x1,
        dy=y2-y1;
    int e;
    double dx_f=dx;
    double dy_f=dy;
    int NoMore;


    if(dx==0 && dy==0 )
        PutPixel(x1, y1, color);


    if(dx==0 && dy!=0)
    {
        e=dy/abs(dy);
        while(y1!=y2)
        {
            PutPixel(x1, y1, color);
            y1=y1+e;
        }
        PutPixel(x2, y2, color);
    }
    if(dy==0 && dx!=0) //case 3 '-'line
    {
        e=dx/abs(dx);
        while(x1!=x2)
        {
            PutPixel(x1, y1, color);
            x1=x1+e;
        }
        PutPixel(x2, y2, color);
    }
    if(dx!=0 && dy!=0)  //case 4 diagonal  Line
    {
        e=dx/abs(dx);
        while(x1!=x2)
        {
            PutPixel(x1, y1, color);
            x1=x1+e;
            NoMore=(dy_f/dx_f)*x1;
            y1=NoMore+(int)((dy_f/dx_f*x1-NoMore)*2);
        }
        PutPixel(x2, y2, color);
    }
}
比起天嵌的那个版本,简洁了许多,不过因为C语言这个学期才刚学,实在没信心,不过还好,写到板子上草草测试了下,好像没问题。


下面是天嵌的版本
void Glib_Line(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1; 
dy=y2-y1;
    
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0)
{
y1+=1;
e-=dx;
}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else   // dy<0
{
dy=-dy;   // dy=abs(dy)


if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else   // dy<0
{
dy=-dy;   // dy=abs(dy)


if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值