看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;
}
}
}
}
}
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;
}
}
}
}
}