/*用Bresenham算法画一条线(不检查参数,自定义颜色)
//==================================================================
//函数名: lcd_color_bresenhamline()
//功能: 在座标(x1, y1) 和 (x2, y2)之间画一条线,不检查任何参数的对错。
//输入参数:(x1, y1):画线的起始座标
(x2, y2):画线的结束座标
DISP_MODE_PUT: 直接设置
DISP_MODE_OR: 与屏幕原有值“或取”后再写
DISP_MODE_XOR: 与屏幕原有值“异或”后再写
DISP_MODE_AND: 与屏幕原有值“与取”后再写
color:线条颜色
//返回值: 成功返回0,失败返回API_ERR,参数错误返回PARA_ERR
//注意事项:带线条颜色,不刷新LCD
//=================================================================*/
- int lcd_color_bresenhamline(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char mode, unsigned char color)
- {
- if ((x0 == x1) && (y0 == y1))
- {
- return lcd_enput_pixel(x0, y0, 1, mode, color);
- }
- int dx,dy; //定义X.Y轴上增加的变量值
- int sub;
- int retval;
- dx = abs(x1 - x0); //X轴方向上的增量
- dy = abs(y1 - y0); //Y轴方向上的增量
- /* 布兰森汉姆(Bresenham)算法画线 */
- if (dx > dy) //靠近X轴
- {
- sub = 2 * dy - dx; //计算下个点的位置
- while (x0 != x1)
- {
- retval = lcd_enput_pixel(x0, y0, 1, mode, color); //画起点
- if (retval < 0)
- {
- return retval;
- }
- if (x1 > x0)
- {
- x0++;
- }
- else
- {
- x0--; //X轴上加1
- }
- if (sub > 0) //判断下下个点的位置
- {
- if (y1 > y0)
- {
- y0++;
- }
- else
- {
- y0--; //为右上相邻点,即(x0+1,y0+1)
- }
- sub += (2 * dy) - (2 * dx);
- }
- else
- {
- sub += 2 * dy; //判断下下个点的位置
- }
- }
- retval = lcd_enput_pixel(x0, y0, 1, mode, color);
- if (retval < 0)
- {
- return retval;
- }
- }
- else
- {
- sub = 2 * dx - dy; //靠近Y轴
- while (y0 != y1)
- {
- retval = lcd_enput_pixel(x0, y0, 1, mode, color); //画起点
- if (retval < 0)
- {
- return retval;
- }
- if (y1 > y0)
- {
- y0++;
- }
- else
- {
- y0--;
- }
- if (sub > 0) //判断下下个点的位置
- {
- if (x1 > x0)
- {
- x0++;
- }
- else
- {
- x0--;
- }
- sub += (2 * dx) - (2 * dy);
- }
- else
- {
- sub += 2 * dx;
- }
- }
- retval = lcd_enput_pixel(x0, y0, 1, mode, color);
- if (retval < 0)
- {
- return retval;
- }
- }
- return API_OK;
- }