OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3158|回复: 0

TFTLCD显示直线算法

[复制链接]

17

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2017-5-5
在线时间
68 小时
发表于 2017-9-8 16:24:59 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 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;
}     
}
}


QQ截图20170908162611.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 05:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表