研究生
最后登录1970-1-1
在线时间 小时
注册时间2021-8-30
|
本帖最后由 一级菜鸟 于 2021-10-3 12:55 编辑
这是霸道系列开发板的液晶驱动那节课的一个例程
例程中一个根据俩个坐标画线的函数,以下是例程中的原函数
- /**
- * [url=home.php?mod=space&uid=41770]@brief[/url] 在 ILI9341 显示器上使用 Bresenham 算法画线段
- * @param usX1 :在特定扫描方向下线段的一个端点X坐标
- * @param usY1 :在特定扫描方向下线段的一个端点Y坐标
- * @param usX2 :在特定扫描方向下线段的另一个端点X坐标
- * @param usY2 :在特定扫描方向下线段的另一个端点Y坐标
- * [url=home.php?mod=space&uid=87825]@note[/url] 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
- * @retval 无
- */
- void ILI9341_DrawLine ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 )
- {
- uint16_t us;
- uint16_t usX_Current, usY_Current;
-
- int32_t lError_X = 0, lError_Y = 0, lDelta_X, lDelta_Y, lDistance;
- int32_t lIncrease_X, lIncrease_Y;
-
-
- lDelta_X = usX2 - usX1; //计算坐标增量
- lDelta_Y = usY2 - usY1;
-
- usX_Current = usX1;
- usY_Current = usY1;
-
-
- if ( lDelta_X > 0 )
- lIncrease_X = 1; //设置单步方向
-
- else if ( lDelta_X == 0 )
- lIncrease_X = 0;//垂直线
-
- else
- {
- lIncrease_X = -1;
- lDelta_X = - lDelta_X;
- }
-
- if ( lDelta_Y > 0 )
- lIncrease_Y = 1;
-
- else if ( lDelta_Y == 0 )
- lIncrease_Y = 0;//水平线
-
- else
- {
- lIncrease_Y = -1;
- lDelta_Y = - lDelta_Y;
- }
-
- if ( lDelta_X > lDelta_Y )
- lDistance = lDelta_X; //选取基本增量坐标轴
-
- else
- lDistance = lDelta_Y;
-
- for ( us = 0; us <= lDistance + 1; us ++ )//画线输出
- {
- ILI9341_SetPointPixel ( usX_Current, usY_Current );//画点
-
- lError_X += lDelta_X ;
- lError_Y += lDelta_Y ;
-
- if ( lError_X > lDistance )
- {
- lError_X -= lDistance;
- usX_Current += lIncrease_X;
- }
-
- if ( lError_Y > lDistance )
- {
- lError_Y -= lDistance;
- usY_Current += lIncrease_Y;
- }
-
- }
复制代码 下面是我自己改写的函数,是根据两点法求直线的灵感来写的
自己写完感觉代码冗余量有点多,不过一个新手希望大家谅解。
希望各位前辈给予指导- /*这里我就没有修改函数名,输入参数也是一样的*/
- void ILI9341_DrawLine(uint16_t usX1, uint16_t usY1,uint16_t usX2,uint16_t usY2)
- {
- uint16_t i,j,n,Y,xmin,xmax,ymin,ymax;/*这里定义的变量有点多,i,j,n都是循环变量,Y是用来存放整型数据的Y坐标*/
- n=0;/*n变量每次调用这个函数时初始化为0表示从0开始计数*/
- double k,y;/*定义两个浮点型变量,k用来存放直线的斜率,y用来存放计算后的Y坐标*/
- uint16_t X_Y[240*320][2] = {0};/*定义一个二维数组用来存放X,Y坐标,240*320是应为使用3.2寸的屏幕时像素点只有这么多,每次调用函数时数组初始化为空方便存入新的数据*/
- /*下面两个if语句用来整理传入的X,Y坐标,方便下面计算*/
- if(usX1>usX2)
- {
- xmax = usX1;
- xmin = usX2;
- }else{
- xmax = usX2;
- xmin = usX1;
- }
- if(usY1>usY2)
- {
- ymax = usY1;
- ymin = usY2;
- }else{
- ymax = usY2;
- ymin = usY1;
- }
- /*根据两点式求出直线的斜率*/
- k = (ymax - ymin) / (xmax - xmin);
-
- /*遍历两点之间的所有X坐标,也可以改为遍历Y坐标*/
- for(i=xmin;i<=xmax;i++)
- {
- y = k * (i - xmin) + ymin;/*根据斜率计算出Y坐标*/
- Y = (uint16_t)y;/*此时Y坐标为浮点型,将他转换为整型数据存放在数组中*/
- X_Y[n][] = {i,Y};/*把X,Y坐标存入数组*/
- n++;
- }
- /*遍历存放坐标的数组*/
- for(j=0;j<n;j++)
- {
- ILI9341_SetPointPixel ( X_Y[j][0], X_Y[j][1] );/*这个函数的作用是根据坐标填充像素点,把数组中的X,Y坐标作为参数传入这个函数*/
- }
- }
复制代码
|
|