⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphics.c

📁 适用于图形LCD的图形驱动程序,可实现画任意直线,任意圆,使用时只要再提供一个与LCD控制器相匹配的画点程序即可.
💻 C
字号:
#include <GRAPHICS.H>

/****************************************************************************
* 名称:HLine()
* 功能:画水平线。
* 入口参数:x0		水平线起点所在列的位置
*          y0		水平线起点所在行的位置
*          x1      	水平线终点所在列的位置
*          color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  HLine(uchar x0, uchar y0, uchar x1, uchar color) 
{  uchar  bak;

   if(x0>x1) 						// 对x0、x1大小进行排列,以便画图
   {  bak = x1;
      x1 = x0;
      x0 = bak;
   }
   
   do
   {  Point(x0, y0, color);		// 逐点显示,描出垂直线
      x0++;
   }while(x1>=x0);
}


/****************************************************************************
* 名称:RLine()
* 功能:画垂直线。
* 入口参数:x0		垂直线起点所在列的位置
*          y0		垂直线起点所在行的位置
*          y1      	垂直线终点所在行的位置
*          color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  RLine(uchar x0, uchar y0, uchar y1, uchar color) 
{  uchar  bak;

   if(y0>y1) 						// 对y0、y1大小进行排列,以便画图
   {  bak = y1;
      y1 = y0;
      y0 = bak;
   }
   do
   {  Point(x0, y0, color);		// 逐点显示,描出垂直线
      y0++;
   }while(y1>=y0);	
}


/****************************************************************************
* 名称:Rectangle()
* 功能:画矩形。
* 入口参数:x0		矩形起点所在列的位置
*          y0		矩形起点所在行的位置
*          x1      	矩形终点所在列的位置
*          y1      	矩形终点所在行的位置
*          color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  Rectangle(uchar x0, uchar y0, uchar x1, uchar y1, uchar color)
{  HLine(x0, y0, x1, color);
   HLine(x0, y1, x1, color);
   RLine(x0, y0, y1, color);
   RLine(x1, y0, y1, color);
}

/****************************************************************************
* 名称:Line()
* 功能:画任意两点之间的直线。
* 入口参数: x0		直线起点所在列的位置
*           y0		直线起点所在行的位置
*           x1      	直线终点所在列的位置
*           y1      	直线终点所在行的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  Line(uchar x0, uchar y0, uchar x1, uchar y1, uchar color)
{  int   dx;		// 直线x轴差值变量
   int   dy;          	// 直线y轴差值变量
   char  dx_sym;	// x轴增长方向,为-1时减值方向,为1时增值方向
   char  dy_sym;	// y轴增长方向,为-1时减值方向,为1时增值方向
   int   dx_x2;		// dx*2值变量,用于加快运算速度
   int   dy_x2;		// dy*2值变量,用于加快运算速度
   int   di;		// 决策变量
   
   
   dx = x1-x0;		// 求取两点之间的差值
   dy = y1-y0;
   
   /* 判断增长方向,或是否为水平线、垂直线、点 */
   if(dx>0)				// 判断x轴方向
   {  dx_sym = 1;			// dx>0,设置dx_sym=1
   }
   else
   {  if(dx<0)
      {  dx_sym = -1;			// dx<0,设置dx_sym=-1
      }
      else
      {  // dx==0,画垂直线,或一点
         RLine(x0, y0, y1, color);
      	 return;
      }
   }
   
   if(dy>0)				// 判断y轴方向
   {  dy_sym = 1;			// dy>0,设置dy_sym=1
   }
   else
   {  if(dy<0)
      {  dy_sym = -1;			// dy<0,设置dy_sym=-1
      }
      else
      {  // dy==0,画水平线,或一点
         HLine(x0, y0, x1, color);
      	 return;
      }
   }
    
   /* 将dx、dy取绝对值 */
   dx = dx_sym * dx;
   dy = dy_sym * dy;
 
   /* 计算2倍的dx及dy值 */
   dx_x2 = dx*2;
   dy_x2 = dy*2;
   
   /* 使用Bresenham法进行画直线 */
   if(dx>=dy)				// 对于dx>dy,则使用x轴为基准
   {  di = dy_x2 - dx;
      while(x0!=x1)
      {  Point(x0, y0, color);
         x0 += dx_sym;
         if(di<0)
         {  di += dy_x2;		// 计算出下一步的决策值
         }
         else
         {  di += dy_x2 - dx_x2;
            y0 += dy_sym;
         }
      }
      Point(x0, y0, color);		// 显示最后一点
   }
   else					// 对于dx<=dy,则使用y轴为基准
   {  di = dx_x2 - dy;
      while(y0!=y1)
      {  Point(x0, y0, color);
         y0 += dy_sym;
         if(di<0)
         {  di += dx_x2;
         }
         else
         {  di += dx_x2 - dy_x2;
            x0 += dx_sym;
         }
      }
      Point(x0, y0, color);		// 显示最后一点
   }
}
/****************************************************************************
* 名称:RectangleFill()
* 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
* 入口参数: x0		矩形起点所在列的位置
*           y0		矩形起点所在行的位置
*           x1      	矩形终点所在列的位置
*           y1      	矩形终点所在行的位置
*           color	填充颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  RectangleFill(uchar x0, uchar y0, uchar x1, uchar y1, uchar color)
{  uchar  i;

   /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
   if(x0>x1) 				// 若x0>x1,则交换x0
   {  i = x0;
      x0 = x1;
      x1 = i;
   }
   if(y0>y1)				// 若y0>y1,则交换y0
   {  i = y0;
      y0 = y1;
      y1 = i;
   }
   
   /* 判断是否只是直线 */
   if(y0==y1) 
   {  HLine(x0, y0, x1, color);
      return;
   }
   if(x0==x1) 
   {  RLine(x0, y0, y1, color);
      return;
   }

   while(y0<=y1)						
   {  HLine(x0, y0, x1, color);		// 当前画水平线
      y0++;				// 下一行
   }
}

/********************************************/
/* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/********************************************/
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s)
{
    unsigned int xx,rr;
    unsigned int xt,yt;
    unsigned int rs,row,col;
    yt = Rx;
    rr = (unsigned int)Rx*Rx+1; // 补偿1 修正方形
    rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
    for (xt=0;xt<=rs;xt++)
    {
        xx = xt*xt;
        while ((yt*yt)>(rr-xx))
        {
            yt--;
        }
        row = Ox+xt; // 第一象限
        col = Oy-yt;

        Point(row,col,s);
        row = Ox-xt; // 第二象限
        Point(row,col,s);
        col = Oy+yt; // 第三象限
        Point(row,col,s);
        row = Ox+xt; // 第四象限
        Point(row,col,s);
        /***************45度镜象画另一半***************/
        row = Ox+yt; // 第一象限
        col = Oy-xt;
        Point(row,col,s);
        row = Ox-yt; // 第二象限
        Point(row,col,s);
        col = Oy+xt; // 第三象限
        Point(row,col,s);
        row = Ox+yt; // 第四象限
        Point(row,col,s);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -