21:45:03
依然呆 2016/1/2 21:45:03
/**************************************************************************
指针式时钟
说明:
入口:
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太小没有意义了,时分秒针可以定义颜色。
|