画线算法

/*用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
//=================================================================*/
 

Code:
  1. int lcd_color_bresenhamline(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char mode, unsigned char color)   
  2. {   
  3.     if ((x0 == x1) && (y0 == y1))   
  4.     {   
  5.         return lcd_enput_pixel(x0, y0, 1, mode, color);   
  6.     }   
  7.   
  8.     int dx,dy;               //定义X.Y轴上增加的变量值   
  9.     int sub;   
  10.     int retval;   
  11.   
  12.     dx = abs(x1 - x0);               //X轴方向上的增量   
  13.     dy = abs(y1 - y0);               //Y轴方向上的增量   
  14.   
  15.     /* 布兰森汉姆(Bresenham)算法画线 */  
  16.     if (dx > dy)                 //靠近X轴   
  17.     {   
  18.         sub = 2 * dy - dx;             //计算下个点的位置   
  19.         while (x0 != x1)   
  20.         {   
  21.             retval = lcd_enput_pixel(x0, y0, 1, mode, color);   //画起点   
  22.             if (retval < 0)   
  23.             {   
  24.                 return retval;   
  25.             }   
  26.             if (x1 > x0)   
  27.             {   
  28.                 x0++;   
  29.             }   
  30.             else  
  31.             {   
  32.                 x0--;                 //X轴上加1   
  33.             }   
  34.             if (sub > 0)               //判断下下个点的位置   
  35.             {   
  36.                 if (y1 > y0)   
  37.                 {   
  38.                     y0++;   
  39.                 }   
  40.                 else  
  41.                 {   
  42.                     y0--;                 //为右上相邻点,即(x0+1,y0+1)   
  43.                 }   
  44.                 sub += (2 * dy) - (2 * dx);   
  45.             }   
  46.             else  
  47.             {   
  48.                 sub += 2 * dy;           //判断下下个点的位置   
  49.             }   
  50.         }   
  51.         retval = lcd_enput_pixel(x0, y0, 1, mode, color);   
  52.         if (retval < 0)   
  53.         {   
  54.             return retval;   
  55.         }   
  56.     }   
  57.     else  
  58.     {   
  59.         sub = 2 * dx - dy;             //靠近Y轴   
  60.         while (y0 != y1)   
  61.         {   
  62.             retval = lcd_enput_pixel(x0, y0, 1, mode, color);       //画起点   
  63.             if (retval < 0)   
  64.             {   
  65.                 return retval;   
  66.             }   
  67.             if (y1 > y0)   
  68.             {   
  69.                 y0++;   
  70.             }   
  71.             else  
  72.             {   
  73.                 y0--;   
  74.             }   
  75.             if (sub > 0)             //判断下下个点的位置   
  76.             {   
  77.                 if (x1 > x0)   
  78.                 {   
  79.                     x0++;   
  80.                 }   
  81.                 else  
  82.                 {   
  83.                     x0--;   
  84.                 }   
  85.                 sub += (2 * dx) - (2 * dy);   
  86.             }   
  87.             else  
  88.             {   
  89.                 sub += 2 * dx;   
  90.             }   
  91.         }   
  92.         retval = lcd_enput_pixel(x0, y0, 1, mode, color);   
  93.         if (retval < 0)   
  94.         {   
  95.             return retval;   
  96.         }   
  97.     }   
  98.     return API_OK;   
  99. }   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值