高级会员
主题
帖子
积分691
阅读权限30
注册时间2011-5-31
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2015-9-10 09:28
|
显示全部楼层
本帖最后由 zhou19852 于 2015-9-10 09:36 编辑
/**************************************************************************
指针式时钟
说明:
入口:
x0 = 表盘圆心X坐标
y0 = 表盘圆心Y坐标
r=表盘半径
ClkCor = 表盘颜色
SecPotCor = 秒针颜色
MinPotCor= 分钟颜色
HourPotCor= 时针颜色
*Clocker = 当前时间结构体
返回:无
**************************************************************************/
void ClockDial(uchar x0,y0,r,ClkCor,SecPotCor,MinPotCor,HourPotCor,Clock *Clocker)
{
//角度转弧度公式 2*PI/360*角度
#define PI 3.1415926
float i;
static float idata RadSecondx,RadSecondy,RadMinutex,RadMinutey,RadHourx,RadHoury;
for(i=0;i<=2*PI;i+=PI/6) //画表盘12等分:2*PI/12
{
PrintDot( x0+r*sin(i),y0+r*cos(i),0,ClkCor);
PrintDot( x0+(r-1)*sin(i),y0+(r-1)*cos(i),0,ClkCor) ;
}
Linexy(x0,y0,x0+(r-3)*RadSecondx,y0-(r-3)*RadSecondy,0,Black) ; //清除上一秒针轨迹
RadSecondx=sin(PI/180*6*BCDtoHEX(Clocker->Second)); //计算秒针当前弧度正余弦
RadSecondy=cos(PI/180*6*BCDtoHEX(Clocker->Second));
Linexy(x0,y0,x0+(r-3)*RadSecondx,y0-(r-3)*RadSecondy,0,SecPotCor) ;//画出当前秒针
Linexy(x0,y0,x0+(r-5)*RadMinutex,y0-(r-5)*RadMinutey,0,Black) ; //清除上一分针轨迹
RadMinutex=sin(PI/180*6*BCDtoHEX(Clocker->Minute)); //计算分针当前弧度正余弦
RadMinutey=cos(PI/180*6*BCDtoHEX(Clocker->Minute));
Linexy(x0,y0,x0+(r-5)*RadMinutex,y0-(r-5)*RadMinutey,0,MinPotCor) ; //画出当前分针
Linexy(x0,y0,x0+(r-9)*RadHourx,y0-(r-9)*RadHoury,0,Black) ; //清除上一时针轨迹
RadHourx=sin(PI/180*(30*(BCDtoHEX(Clocker->Hour)%12)+BCDtoHEX(Clocker->Minute)/12*6));//计算时针针当前弧度正余弦
RadHoury=cos(PI/180*(30*(BCDtoHEX(Clocker->Hour)%12)+BCDtoHEX(Clocker->Minute)/12*6));
Linexy(x0,y0,x0+(r-9)*RadHourx,y0-(r-9)*RadHoury,0,HourPotCor) ; //画出当前时针
}
Linexy为任意角度画线函数,PrintDot为画点函数,可以在任意位置显示r>10的指针时钟,r<10太小没有意义了,时分秒针可以定义颜色。要是想在一个界面显示几个指针时钟,可以把函数复制几个,命名不同就可以了,也可以想办法重入。
|
|