上面是我的微信和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);
}
}