OpenEdv-开源电子网

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

LCD画线讨论

[复制链接]

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-11-26 14:38:00 | 显示全部楼层 |阅读模式
原子哥和各位大神:
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; 
}  
}  

这个函数能否详细讲解下啊,没明白什么意思啊??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-11-26 15:28:45 | 显示全部楼层
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)  //定义四个变量,两个x方向,两个y方向  
                                                                                                        可以理解为起点(x1,y1)终点(x2,y2)把这两个点连接起来。
{
u16 t; 
int xerr=0,yerr=0,delta_x,delta_y,distance; 
int incx,incy,uRow,uCol; 

delta_x=x2-x1; //计算坐标增量  两个坐标点x方向的差
delta_y=y2-y1;     // y方向的差
uRow=x1;     // 把起始坐标赋给一个临时变量
uCol=y1;     //
if(delta_x>0)incx=1; //设置单步方向    //这几个if else 是通过判断delta_X 和delta_y
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; //选取基本增量坐标轴  看是x方向的增量大还是y方向大。选大的作为
else distance=delta_y; 
for(t=0;t<=distance+1;t++ )//画线输出 
{  
LCD_DrawPoint(uRow,uCol);//画点  第一个点是 (x1,y1) 
xerr+=delta_x ;    //第二个点是 (x1+incx,y1+incy)
yerr+=delta_y ;    //最后一个点   (x2,y2)
if(xerr>distance) //然后就以distance为增量,开始做x y方向的“增加 "直到增加到(x2,y2)

xerr-=distance; 
uRow+=incx; 

if(yerr>distance) 

yerr-=distance; 
uCol+=incy; 

}  
}
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-11-26 15:29:20 | 显示全部楼层
我也是刚刚开始学,希望没有说错。
回复 支持 反对

使用道具 举报

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
 楼主| 发表于 2013-11-26 16:19:53 | 显示全部楼层
回复【2楼】sunday151640:
---------------------------------
谢谢啦,但我还是没弄明白啊,for(t=0;t<=distance+1;t++ )//画线输出  
{   
LCD_DrawPoint(uRow,uCol);//画点  第一个点是 (x1,y1)  
xerr+=delta_x ;     ??? 
yerr+=delta_y ;     ???? 
if(xerr>distance)      ???? 
{  
xerr-=distance;  
uRow+=incx; 
}  
if(yerr>distance)          ?????
{  
yerr-=distance;  
uCol+=incy;  
}  
}
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-11-26 16:56:40 | 显示全部楼层
LCD_DrawPoint(uRow,uCol);//画点  第一个点是 (x1,y1) 
xerr+=delta_x ;    //第二个点是 (x1+incx,y1+incy)
yerr+=delta_y ;    //最后一个点   (x2,y2)
if(xerr>distance) //然后就以distance为增量,开始做x y方向的“增加 "直到增加到(x2,y2)
{  // 先讨论delta_x >delta_y  distance=delta_x
xerr-=distance;   //     xerr=xerr+delta_x  = distanc
uRow+=incx;     // yerr=yerr+delta_y  < distanc  第一次都不执行 坐标点自加

}  // 第二次 xerr 肯定》 distanc 往x方向++
if(yerr>distance)  //    yerr  与  distance 需要判断   有两种情况:如果大于则++否者不变输出 情况1:(x1+incx,y1+incy)情况2:(x1+incx,y1)
{  //
yerr-=distance; 
uCol+=incy; 
}
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-26 19:01:09 | 显示全部楼层
参考计算机图形学,直线,斜线,圆,椭圆,都有相应算法的
回复 支持 反对

使用道具 举报

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
 楼主| 发表于 2013-11-27 08:46:16 | 显示全部楼层
回复【5楼】sunday151640:
---------------------------------
能分析下在什么情况下uCol+=incy吗?我想知道是什么原理啊。。
谢谢了。。
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-11-27 08:57:39 | 显示全部楼层
if(yerr>distance)          
{  
yerr-=distance;  
uCol+=incy;  
}   

判断,当yerr 》 distance的时候 。这里有写的。。

这里要仔细想想。。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-27 16:48:24 | 显示全部楼层
回复【7楼】summerxiehao:
---------------------------------
最直接的方法就是自己假设两个点的坐标上去运算一下,看下个参数的变换就行啦,或者JTAG硬件仿真看结果
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 12:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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