这个画直线的函数, 算法用数学怎么解释?
/***************************************************************************************************************函 数 名: void Glib_Line(int x1,int y1,int x2,int y2,int color);
**功 能: LCD屏幕画线函数。
**输入参数: x1,y1: 起点坐标
x2,y2: 终点坐标
color: 颜色值5:6:5格式
**返回参数: 无
**其他描述: 无
**************************************************************************************************************/
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;
}
}
}
}
} mark! 找本计算机图形学的书看看,或者搜Bresenham画线算法 回复【2楼】Huaan
找本计算机图形学的书看看,或者搜bresenham画线算法
-----------------------------------------------------------------------
http://www.cnblogs.com/soroman/archive/2006/07/27/509602.html mark! 回复【2楼】Huaan
-----------------------------------------------------------------------
这个算法看起来不是Bresenham算法,直线插补有很多种,以前学数控机床的时候看过一些常用的算法,DDA,软件DDA,中点法,最小二乘法,逐点比较法,好像都跟这个沾不上边,继续求高手给个名字 5L有点理论派,单片机一般算不来最小二乘法的。
是Bresenham算法,核心只有一段:
e=dy-dx/2; //1. 类似于斜率判断
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;} //1.a
x1+=1;
e+=dy; //1.b
} 学习 这个是周立功的源码吧,挺好用的,主要是虚拟的坐标,然后画一条虚拟的直线,直线落在两点之间的,以最接近虚拟直线的那个点为准, 回复【6楼】lxx_sea_sky
-----------------------------------------------------------------------
1 我说的也不是单片机上的算法,而且也没指明平台吧,也没说必须用这些算法,只是说当时学数控机床直线插补的时候看到过这些算法,用C++模拟过这些算法,呵呵看清楚再回复是个好习惯,最早的数控机床用硬件DDA的比较多。
修改原因:错别字 回复【8楼】zhangweimcu
-----------------------------------------------------------------------
6410/2410开发板里面自带的测试程序有个glib.c专门是实现各种基本作图的,这是出自里面的,但是是谁抄谁的就不得而知了,呵呵 mark mark 挖个坟
就是dda算法么,也是Bresenham算法,还没有改进前的原始东西。细节不用太关心,除非做理论研究,
页:
[1]