ocGUI编写(2)--像素点操作

二维码是我创建的QQ群,欢迎新朋友加入。

ocFontSet.textColor = 0x00ff0000;
			ocDrawLine(500,20,280,OC_HORIZONTAL);//画垂直线段
			ocFontSet.textColor = 0x000ff000;
			ocDrawLine(500,20,280,OC_VERTICAL);//画水平线段
			ocFontSet.textColor = 0x0000ff00;
			ocDrawUniLine(360,40,250,88);//画一个任意线段
			ocFontSet.textColor = 0x0000fff0;
			ocDrawRect(50,60,100,100);//画空心矩形
			ocFontSet.textColor = 0x0000f0ff;
			ocDrawFullRect(50,260,100,200);//画实心矩形
			ocFontSet.textColor = 0x00f0ff00;
			ocDrawCircle(500,200,60);//画空心圆形
			ocFontSet.textColor = 0x00ff0000;
			ocDrawFullCircle(300,300,60);//画实心圆形
			ocFontSet.textColor = 0x00ff0000;
			ocDrawTriangle(80,60,80,180,250,210);//画三角形
			ocFontSet.textColor = 0x00ff0ff0;
			ocDrawEllipse(80,120,700,240);//画椭圆

首先上图,看看实际效果,像素不好照片有点模糊了

像素点的操作是GUI的基本功能,在ocGUI里面,我写了几个比较基础的接口

/**********************************************
 * @brief :向指定方向,画一条特定长度的直线
 * @param : Xpos:      直线起点的x坐标
 * @param : Ypos:      直线起点的y坐标
 * @param : Length:    直线的长度
 * @param : Direction: 直线的方向,从左往右或从上至下
 * @note  :none
 * @retval: 绘制成功返回oc_OK,失败返回oc_ON
**********************************************/
uint8_t ocDrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction);

/**********************************************
	* @brief  : 使用 Bresenham 算法画线段(基于两点) 
	* @param  : Xpos1 :线段的一个端点X坐标
	* @param  : Ypos1 :线段的一个端点Y坐标
	* @param  : Xpos2 :线段的另一个端点X坐标
	* @param  : Ypos2 :线段的另一个端点Y坐标
	* @note  
	* @retval : 无
**********************************************/
void ocDrawUniLine ( uint16_t Xpos1, uint16_t Ypos1, uint16_t Xpos2, uint16_t Ypos2 );

/**********************************************
	* @brief  :绘制空心矩形
	* @param  :Xpos :矩形左上角端点X坐标
	* @param  :Ypos :矩形左上角端点Y坐标
	* @param  :Width :矩形宽
	* @param  :Height :矩形高
	* @note :
	* @retval :无
**********************************************/
void ocDrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);

/**********************************************
	* @brief  :绘制实心矩形
	* @param  :Xpos :矩形左上角端点X坐标
	* @param  :Ypos :矩形左上角端点Y坐标
	* @param  :Width :矩形宽
	* @param  :Height :矩形高
	* @note :
	* @retval :无
**********************************************/
void ocDrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);

/**********************************************
	* @brief  :绘制空心圆
	* @param  :Xpos :中心点X坐标
	* @param  :Ypos :中心点Y坐标
	* @param  :Radius :圆形半径
	* @note :
	* @retval :无
**********************************************/
void ocDrawCircle(uint16_t Xpos,uint16_t Ypos,uint16_t Radius);

/**********************************************
	* @brief  :绘制一个实心圆
	* @param  :Xpos: 圆心X坐标
	* @param  :Ypos: 圆心Y坐标
	* @param  :Radius: 半径
	* @retval :None
**********************************************/
void ocDrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);
	
/**********************************************
	* @brief  :绘制三角形
	* @param  :aXpos :a点x坐标
	* @param  :aYpos :a点y坐标
	* @param  :bXpos :b点x坐标
	* @param  :bYpos :b点y坐标
	* @param  :cXpos :c点x坐标
	* @param  :cYpos :c点y坐标
	* @note :
	* @retval :无
**********************************************/
void ocDrawTriangle(uint16_t aXpos,uint16_t aYpos,uint16_t bXpos,uint16_t bYpos,uint16_t cXpos,uint16_t cYpos);
	
/**********************************************
	* @brief  : 使用 Bresenham 算法画椭圆
	* @param  : Xpos1 :线段的一个端点X坐标
	* @param  : Ypos1 :线段的一个端点Y坐标
	* @param  : Xpos2 :线段的另一个端点X坐标
	* @param  : Ypos2 :线段的另一个端点Y坐标
	* @note  
	* @retval : 无
**********************************************/
void ocDrawEllipse (int xRadius, int yRadius, int Xpos, int Ypos);

在这几个接口里面,有三个函数都是使用的Bresenham算法

第一个是画任意方向线段

/**********************************************
	* @brief  : 使用 Bresenham 算法画线段(基于两点) 
	* @param  : Xpos1 :线段的一个端点X坐标
	* @param  : Ypos1 :线段的一个端点Y坐标
	* @param  : Xpos2 :线段的另一个端点X坐标
	* @param  : Ypos2 :线段的另一个端点Y坐标
	* @note  
	* @retval : 无
**********************************************/
void ocDrawUniLine ( uint16_t Xpos1, uint16_t Ypos1, uint16_t Xpos2, uint16_t Ypos2 )
{
	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 = Xpos2 - Xpos1; //计算坐标增量 
	lDelta_Y = Ypos2 - Ypos1; 
	
	usX_Current = Xpos1; 
	usY_Current = Ypos1; 
	
	
	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 ++ )//画线输出 
	{  
		ocPutDot ( 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; 
		} 
	}  	
}   

第二个是画圆函数

/**********************************************
	* @brief  :绘制空心圆
	* @param  :Xpos :中心点X坐标
	* @param  :Ypos :中心点Y坐标
	* @param  :Radius :圆形半径
	* @note :
	* @retval :无
**********************************************/
void ocDrawCircle(uint16_t Xpos,uint16_t Ypos,uint16_t Radius)
{
	int16_t mx=Xpos,my=Ypos,x=0,y=Radius;
	int16_t d=1-Radius;
	while(y>x)
	{
		ocPutDot(x+mx,y+my);
		ocPutDot(-x+mx,y+my);
		ocPutDot(-x+mx,-y+my);
		ocPutDot(x+mx,-y+my);
		ocPutDot(y+mx,x+my);
		ocPutDot(-y+mx,x+my);
		ocPutDot(y+mx,-x+my);
		ocPutDot(-y+mx,-x+my);
		if(d<0)
		{
			d += 2*x+3;
		}
		else
		{
			d += 2*(x-y)+5;
			y--;
		}
		x++;
	}
}

第三个是画椭圆的函数

/**********************************************
	* @brief  : 使用 Bresenham 算法画椭圆
	* @param  : Xpos1 :线段的一个端点X坐标
	* @param  : Ypos1 :线段的一个端点Y坐标
	* @param  : Xpos2 :线段的另一个端点X坐标
	* @param  : Ypos2 :线段的另一个端点Y坐标
	* @note  
	* @retval : 无
**********************************************/
void ocDrawEllipse (int xRadius, int yRadius, int Xpos, int Ypos)
{
	int x,y;
	float d1,d2;
	x = 0;y = yRadius;
	d1=yRadius*yRadius+xRadius*xRadius*(-yRadius+0.25);

	ocPutDot(Xpos+x,Ypos+y);
	ocPutDot(Xpos-x,Ypos-y);
	ocPutDot(Xpos-x,Ypos+y);
	ocPutDot(Xpos+x,Ypos-y);

  while(yRadius*yRadius*(x+1) < xRadius*xRadius*(y-0.5))
	{
		if(d1<=0)
		{
			d1+=yRadius*yRadius*(2*x+3);
			x++;
		}
		else
		{
			d1+=yRadius*yRadius*(2*x+3)+xRadius*xRadius*(-2*y+2);
			x++;
			y--;
		}
    ocPutDot(Xpos+x,Ypos+y);
    ocPutDot(Xpos-x,Ypos-y);
    ocPutDot(Xpos-x,Ypos+y);
    ocPutDot(Xpos+x,Ypos-y);
  }//while上半部分
  d2=yRadius*yRadius*(x+0.5)*(x+0.5)+xRadius*xRadius*(y-1)*(y-1)-xRadius*xRadius*yRadius*yRadius;
	while(y>0)
	{
		if(d2<=0)
		{
			d2+=yRadius*yRadius*(2*x+2)+xRadius*xRadius*(-2*y+3);
			x++,y--;
		}
		else
		{
			d2+=xRadius*xRadius*(-2*y+3);
			y--;
		}
    ocPutDot(Xpos+x,Ypos+y);
    ocPutDot(Xpos-x,Ypos-y);
    ocPutDot(Xpos-x,Ypos+y);
    ocPutDot(Xpos+x,Ypos-y);
  }
}

猜你喜欢

转载自blog.csdn.net/Jun626/article/details/81413897
今日推荐