OpenEdv-开源电子网

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

液晶屏画线问题请教

[复制链接]

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-4-29
在线时间
0 小时
发表于 2015-8-16 21:41:18 | 显示全部楼层 |阅读模式
5金钱
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 t; 
int xerr=0,yerr=0,delta_x,delta_y,distance; 
int incx,incy,uRow,uCol; 

delta_x=x2-x1; //????×?±ê???? 
delta_y=y2-y1; 
uRow=x1; 
uCol=y1; 
if(delta_x>0)incx=1; //?è??????·??ò 
else if(delta_x==0)incx=0;//???±?? 
else {incx=-1;delta_x=-delta_x;} 
if(delta_y>0)incy=1; 
else if(delta_y==0)incy=0;//?®???? 
else{incy=-1;delta_y=-delta_y;} 
if( delta_x>delta_y)distance=delta_x; //?????ù±?????×?±ê?á 
else distance=delta_y; 
for(t=0;t<=distance+1;t++ )//???????? 
{  
LCD_DrawPoint(uRow,uCol);//???? 
xerr+=delta_x ; 
yerr+=delta_y ; 
if(xerr>distance) 

xerr-=distance; 
uRow+=incx; 

if(yerr>distance) 

yerr-=distance; 
uCol+=incy; 

}  
}    这个画线函数有点看不懂,xerr+=delta_x ; 
yerr+=delta_y ; if( delta_x>delta_y)distance=delta_x;
else distance=delta_y;  xerr或者yerr初值为0,那xerr+=delta_x ; xerr就等于delta_x 那distance也等于delta_x ,那怎么进入if(xerr>distance) 

xerr-=distance; 
uRow+=incx; 
这个函数中,不明白

最佳答案

查看完整内容[请看2#楼]

你疑问的地方是因为算法本身有问题。这个算法的写法,在这块多费了一步,也就是当 t=0的那次循环所画的点实际上是没用的。它会被第二次循环重新画一遍。 其实,真正的画点是从 t=1 开始的。因为一共只需要画 distance + 1 个点,但是循环实际上画了 distance + 2 个点。因为它知道自己的第一次是白画的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-16 21:41:19 | 显示全部楼层
你疑问的地方是因为算法本身有问题。这个算法的写法,在这块多费了一步,也就是当 t=0的那次循环所画的点实际上是没用的。它会被第二次循环重新画一遍。

其实,真正的画点是从 t=1 开始的。因为一共只需要画 distance + 1 个点,但是循环实际上画了 distance + 2 个点。因为它知道自己的第一次是白画的。
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-16 22:34:23 | 显示全部楼层
我也看不明白 ,直接“借来用“便是,我不关心它的原理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
发表于 2015-8-17 10:14:52 | 显示全部楼层
它不是会加上去的吗?你应该就看了一个循环,看到第二个就应该懂了。
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-4
在线时间
0 小时
发表于 2015-8-17 10:50:28 | 显示全部楼层
它是以横纵坐标来取点话线的,所以划线的点就已边长长的边为取坐标点的个数,就是distance
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-4
在线时间
0 小时
发表于 2015-8-17 11:12:08 | 显示全部楼层
然后用for函数来确定distance个点的坐标,也就是长边的值那么多个坐标,具体的你细看一下,没必要理解的那么透彻,知道怎么用就行了
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-17 15:00:38 | 显示全部楼层

这是我自己把源代码修改的结果

[mw_shl_code=c,true]void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2, ColorTypeDef aColor) { u16 lPointIndex; int lXAssit, lYAssit; int lXDelta = x2 - x1; // 计算坐标增量 int lYDelta = y2 - y1; int lMaxDelta = lXDelta > lYDelta ? lXDelta : lYDelta; int lX = x1; int lY = y1; int lXIncrement, lYIncrement; // 现根据情况设定 X、Y 方向上画线时的递增量 if(lXDelta > 0) lXIncrement = 1; // 设置单步方向 else if(lXDelta == 0) lXIncrement = 0; // 垂直线 else { lXIncrement = -1; lXDelta = -lXDelta; } if(lYDelta > 0) lYIncrement = 1; else if(lYDelta == 0) lYIncrement = 0; // 水平线 else { lYIncrement = -1; lYDelta = -lYDelta; } lXAssit = lXDelta; lYAssit = lYDelta; for(lPointIndex = 1; lPointIndex <= lMaxDelta + 1; lPointIndex++)//画线输出 { LCD_DrawPoint(lX, lY, aColor); //画点 // 计算下一个坐标点 lXAssit += lXDelta; lYAssit += lYDelta; if(lXAssit > lMaxDelta) { lXAssit -= lMaxDelta; lX += lXIncrement; } if(lYAssit > lMaxDelta) { lYAssit -= lMaxDelta; lY += lYIncrement; } } }[/mw_shl_code]

有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-4-29
在线时间
0 小时
 楼主| 发表于 2015-8-18 18:56:32 | 显示全部楼层
是可以进入if语句。想通了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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