本帖最后由 15662170758 于 2017-9-8 16:26 编辑
最近在学习TFTLCD,看到其中有一个直线算法不是很理解,自己在网上搜了一些资料其中有一个Bresenham算法,自己琢磨了半天甚是迷惑,对于这个if (e >= 0) { y++;e=e-1;} 这里怎么也不能理解,求大神们指点,不胜感激
算法原理如下:过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素。该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif图2.1.4 Bresenham算法如图2.1.4所示,设直线方程为yi+1=yi+k(xi+1-xi)+k。假设列坐标象素已经确定为xi,其行坐标为yi。那么下一个象素的列坐标为 xi+1,而行坐标要么为yi,要么递增1为yi+1。是否增1取决于误差项d的值。误差项d的初值d0=0,x坐标每增加1,d的值相应递增直线的斜率 值k,即d=d+k。一旦 d≥1,就把它减去1,这样保证d在0、1之间。当d≥0.5时,直线与垂线x=xi+1交点最接近于当前象素(xi,yi)的右上方象素 (xi+1,yi+1);而当d<0.5时,更接近于右方象素(xi+1,yi)。为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。当e≥0时,取当前象素(xi,yi)的右上方象素(xi+1,yi+1);而当e<0时,取(xi,yi)右方象素(xi+1,yi)。 图2.1.4 Bresenham算法所用误差项的几何含义 Bresenham画线算法程序: void Bresenhamline (int x0,int y0,int x1,int y1,int color) { int x, y, dx, dy; float k, e; dx = x1-x0;dy = y1- y0;k=dy/dx; e=-0.5; x=x0,;y=y0; for (i=0;i<dx;i++) { drawpixel (x, y, color); x=x+1;e=e+k; if (e >= 0) { y++; e=e-1;} } }
一周热门 更多>