金牌会员
 
- 积分
- 2273
- 金钱
- 2273
- 注册时间
- 2015-2-3
- 在线时间
- 561 小时
|
发表于 2015-8-7 10:05:02
|
显示全部楼层
画各种图形的一些算法
不是我自己写的,参考网上的 来源我也记不得了。你可以参考下
//******************************************************************
//函数名: GUI_DrawLine
//作者:
//日期:
//功能: GUI画线
//输入参数:x1,y1:起点坐标
// x2,y2:终点坐标
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)//画线
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
u16 incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{
GUI_DrawPoint(uRow,uCol,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
//******************************************************************
//函数名: GUI_DrawRectangle
//作者:
//日期:
//功能: GUI画矩形(非填充)
//输入参数:(x1,y1),(x2,y2):矩形的对角坐标
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
GUI_DrawLine(x1,y1,x2,y1,color);
GUI_DrawLine(x1,y1,x1,y2,color);
GUI_DrawLine(x1,y2,x2,y2,color);
GUI_DrawLine(x2,y1,x2,y2,color);
}
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{
u16 i,j;
u16 width=ex-sx+1; //得到填充的宽度
u16 height=ey-sy+1; //高度
LCD_SetPos(sx,sy,ex-1,ey-1);//设置显示窗口
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
GUI_DrawPoint(sx+j,sy+i,color); //写入数据
}
LCD_SetPos(0,0,239,319);//恢复窗口设置为全屏
}
//******************************************************************
//函数名: GUI_DrawFillRectangle
//作者:
//日期:
//功能: GUI画矩形(填充)
//输入参数:(x1,y1),(x2,y2):矩形的对角坐标
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_DrawFillRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
LCD_Fill(x1,y1,x2,y2,color);
}
void GUI_DrawPoint(int x,int y,u16 color) //打一个有颜色的点
{
LCD_SetPoints(x,y);
wr_dat(color);
}
//******************************************************************
//函数名: GUI_draw_circle_8
//作者:
//日期:
//功能: 8对称性画圆算法(内部调用)
//输入参数:(xc,yc):圆中心坐标
// (x,y):光标相对于圆心的坐标
// c:填充的颜色
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_draw_circle_8(int xc, int yc, int x, int y, u16 color)
{
GUI_DrawPoint(xc + x, yc + y, color);
GUI_DrawPoint(xc - x, yc + y, color);
GUI_DrawPoint(xc + x, yc - y, color);
GUI_DrawPoint(xc - x, yc - y, color);
GUI_DrawPoint(xc + y, yc + x, color);
GUI_DrawPoint(xc - y, yc + x, color);
GUI_DrawPoint(xc + y, yc - x, color);
GUI_DrawPoint(xc - y, yc - x, color);
}
//******************************************************************
//函数名: GUI_circle
//作者:
//日期:
//功能: 在指定位置画一个指定大小的圆(填充)
//输入参数:(xc,yc):圆中心坐标
// c:填充的颜色
// r:圆半径
// fill:填充判断标志,1-填充,0-不填充
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_circle(int xc, int yc,u16 c,int r, int fill)
{
int x = 0, y = r, yi, d;
d = 3 - 2 * r;
if (fill)
{
// 如果填充(画实心圆)
while (x ><= y)
{
for (yi = x; yi <= y; yi++)
{
GUI_draw_circle_8(xc, yc, x, yi, c);
}
if (d < 0)
{
d = d + 4 * x + 6;
}
else
{
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}
}
else
{
// 如果不填充(画空心圆)
while (x <= y)
{
GUI_draw_circle_8(xc, yc, x, y, c);
if (d < 0)
{
d = d + 4 * x + 6;
}
else
{
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}
}
}
//******************************************************************
//函数名: GUI_PutChar
//作者:
//日期:
//功能: 在指定位置画一个指定大小的圆(填充)
//输入参数:(x,y):字符的坐标
// c:字符
//
// fColor:字符填充的颜色
// bColor:背景颜色
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor)//显示单个字符
{
LCD_PutChar8x16( x, y, c, fColor, bColor );
}
/******************************************************************
- 功能描述:将一个字符串转为32位的变量,比如"1234"转为1234
- 隶属模块:公开函数模块
- 函数属性:外部,用户可调用
- 参数说明:str:指向待转换的字符串
- 返回说明:转换后的数值
******************************************************************/
//
//void u32tostr(unsigned long dat,char *str)
//{
// char idata temp[20];
// unsigned char idata i=0,j=0;
//
// i=0;
// while(dat)
// {
// temp=dat%10+0x30;
// i++;
// dat/=10;
// }
// j=i;
// for(i=0;i<j;i++)
// {
// str=temp[j-i-1];
// }
// if(!i) {str[i++]='0';}
// str=0;
//}
//******************************************************************
//函数名: GUI_PutString
//作者:
//日期:
//功能: 在指定位置画一个指定大小的圆(填充)
//输入参数:(x,y):字符的坐标
// *s:字符串
//
// fColor:字符串填充的颜色
// bColor:背景颜色
//返回值: 无
//修改记录:无
//******************************************************************
void GUI_PutString(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor)// 显示字符串
{
unsigned char l=0;
while(*s)
{
if( *s >< 0x80)
{
GUI_PutChar(x+l*8,y,*s,fColor,bColor);
s++;l++;
}
else
{
PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor);
s+=2;l+=2;
}
}
} |
|