|
本帖最后由 飞宇 于 2016-9-27 22:25 编辑
有了画点的基础,画线就比较容易了。画线的时候,有下面三种类型的直线:
1). 画水平直线。
2). 画垂直直线。 3). 画任意直线。
水平直线:水平直线的y坐标相同,从x坐标的起点到终点逐个画点即可实现。
程序清单:
- /************************************************************************
- * 描 述 : LCD12864液晶画水平直线
- * 参 数 : x0[in]:起点x轴坐标,范围0~127
- * : x1[in]:终点x轴坐标,范围0~127
- * :y[in]:y轴坐标,范围0~63
- * :color[in]:0=熄灭,1=点亮,2=反显
- * 返回值 : SUCCESS:操作成功,PARM_ERR:输入参数错误
- ************************************************************************/
- uchar DrawHline(uchar x0,uchar x1,uchar y,uchar color)
- {
- uchar temp;
-
- //判断输入参数是否合法
- if((x0>127)||(x1>127)||(y>63))return PARM_ERR;
- if(color>2)return PARM_ERR;
- if(x0>x1)
- {
- temp=x0;x0=x1;
- x1=temp;
- }
- do
- {
- LCD_DrawDot(x0,y,color);
- x0++;
- }
- while(x1>=x0);
-
- return SUCESS;
- }
复制代码 使用画水平直线函数画一条起点(10,30)(100,30)的水平直线,效果如下:
垂直直线:垂直直线和水平直线类似,垂直直线的x坐标相同,从y坐标的起点到终点逐个画点即可实现。
程序清单:
- /************************************************************************
- * 描 述 : LCD12864液晶画垂直直线
- * 参 数 : x[in]:x轴坐标,范围0~127
- * : y0[in]:y轴起点坐标,范围0~63
- * :y1[in]:y轴终点坐标,范围0~63
- * :color[in]:0=熄灭,1=点亮,2=反显
- * 返回值 : SUCCESS:操作成功,PARM_ERR:输入参数错误
- ************************************************************************/
- uchar DrawVline(uchar x,uchar y0,uchar y1,uchar color)
- {
- uchar temp;
-
- //判断输入参数是否合法
- if((x>127)||(y0>63)||(y1>63))return PARM_ERR;
- if(color>2)return PARM_ERR;
- if(y0>y1)
- {
- temp=y0;y1=y0;y0=temp;
- }
- do
- {
- LCD_DrawDot(x,y0,color);
- y0++;
- }
- while(y1>=y0);
-
- return SUCESS;
- }
复制代码 使用画水平直线函数画一条起点(20,10)(20,50)的直线,效果如下:
掌握了画水平直线和垂直直线,画一个基本的表格就很简单了。我们只需算好表格各个线条的起点和终点,使用绘制垂直和水平直线函数绘制即可。
程序清单:
//用水平和垂直直线绘制一个表格
- DrawHline(0,127,0,1);
- DrawHline(0,127,7,1);
- DrawHline(0,127,15,1);
- DrawHline(0,127,23,1);
- DrawHline(0,127,31,1);
- DrawHline(0,127,39,1);
- DrawHline(0,127,47,1);
- DrawHline(0,127,55,1);
- DrawHline(0,127,63,1);
-
- DrawVline(0,0,63,1);
- DrawVline(31,0,63,1);
- DrawVline(63,0,63,1);
- DrawVline(95,0,63,1);
- DrawVline(127,0,63,1);
复制代码
显示效果如下:
任意直线:任意直线相对比较复杂一些,我们需要做的是确定从起点到终点之间有哪些点,描绘这些点即可画出直线。目前比较流行的是采用“Bresenham画线 算法”。从起点开始,x坐标或y坐标每增加1的时候,下一个点的坐标。
Bresenham画线算法:
- Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。
- Bresenham直线算法用的是较为快速的整数加法、减法和位元移位,这会有效的提高处理速度。
- 斜率k=dy/dx。斜率=0:表示画水平直线。斜率=1:表示画垂直直线。X坐标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥1,就把它减去1,这样保证d在0、1之间。当d≥0.5时,最接近于当前象素的右上方象素(x+1,y+1)。而当d<0.5时,更接近于右方象素(x+1,y)。
程序清单:
- /****************************************************************
- * 描 述 : LCD12864液晶画任意直线
- * 参 数 : x0[in]:x轴起点坐标,范围0~127
- * : x1[in]:x轴终点坐标,范围0~127
- * : y0[in]:y轴起点坐标,范围0~63
- * :y1[in]:y轴终点坐标,范围0~63
- * :color[in]:0=熄灭,1=点亮,2=反显
- * 返回值 : 无
- ****************************************************************/
- uchar DrawLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
- {
- int i,distance;
- int x=0,y=0,dx,dy;
- char incx,incy;
- dx=x1-x0; //计算x轴的增量
- dy=y1-y0; //计算y轴的增量
-
- if(dx > 0)incx=1;
- else if(dx == 0)
- {
- //x轴起点和终点相等,表示画垂直直线
- DrawVline(x0,y0,y1,color);
- return SUCESS;
- }
- else incx=-1;
-
- if(dy > 0)incy=1;
- else if(dy == 0)
- {
- //y轴起点和终点相等,表示画水平直线
- DrawHline(x0,y0,y1,color);
- return SUCESS;
- }
- else incy=-1;
-
- //取dx,dy绝对值
- dx=abs(dx);
- dy=abs(dy);
- //角度变换,确保角度<=45°
- if(dx > dy)distance=dx;
- else distance=dy;
-
- //开始绘制直线
- for(i=0;i<=distance+1;i++)
- {
- LCD_DrawDot(x0,y0,color);
- x+=dx;
- y+=dy;
- if(x>distance)
- {
- x-=distance;
- x0+=incx;
- }
- if(y>distance)
- {
- y-=distance;
- y0+=incy;
- }
- }
- return SUCESS;
- }
复制代码 使用画任意直线函数画一条起点(0,0)(128,64)的直线,效果如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|