目录
- 实时时钟
 - 1. 绘制静态秒针
 - 2. 秒针的转动
 - 3. 根据实际时间转动
 - 4. 添加时针和分针
 - 5. 添加表盘刻度
 
实时时钟
本博客介绍利用EasyX实现一个实时钟表的小程序,同时学习时间函数的使用。
 本文源码可从github获取
1. 绘制静态秒针
第一步定义钟表的中心坐标center,它也是秒针的起点;定义秒针的长度secondLength、秒针的终点坐标secondEnd;利用setlinestyle函数设定线的型号和宽度,调用line函数绘制秒针。
#include <graphics.h>
#include <conio.h>
#include <cmath>
using namespace std;
struct Point
{
	int x;
	int y;
};
#define High 480
#define Width 640
int main(void)
{
	initgraph(Width, High);
	Point center, secondEnd;
	center.x = Width / 2;
	center.y = High / 2;
	int sencondLenth = Width / 5;
	secondEnd.x = center.x + sencondLenth;
	secondEnd.y = center.y;
	// 画秒针
	setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
	setcolor(WHITE);
	line(center.x, center.y, secondEnd.x, secondEnd.y);
	_getch();
	closegraph();
	return 0;
}
 

2. 秒针的转动
第二步实现秒针的转动,定义secondAngle为秒针对应的角度,利用三角几何知识求出秒针的终点坐标:
 secondEnd.x = center.x + secondLenth * sin(secondAngle);
 secondEnd.y = center.y - secondLenth * cos(secondAngle);
 让角度循环变化,则实现了秒针转动的动画效果。
#include <graphics.h>
#include <conio.h>
#include <cmath>
using namespace std;
struct Point
{
	int x;
	int y;
};
#define High 480
#define Width 640
#define PI 3.1415926
int main(void)
{
	initgraph(Width, High);
	Point center, secondEnd;
	center.x = Width / 2;
	center.y = High / 2;
	int secondLenth = Width / 5;
	secondEnd.x = center.x + secondLenth;
	secondEnd.y = center.y;
	double secondAngle = 1.0; 
	while (true)
	{
		// 由角度决定终点坐标
		secondEnd.x = center.x + secondLenth * sin(secondAngle);
		secondEnd.y = center.y - secondLenth * cos(secondAngle);
		// 画秒针
		setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
		setcolor(WHITE);
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		Sleep(100);
		setcolor(BLACK);
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		// 秒针角度变化
		secondAngle = secondAngle * 2 * PI / 60 + 1;
	}
	_getch();
	closegraph();
	return 0;
}
 

3. 根据实际时间转动
第三步定义系统变量(SYSTEMTIME ti),通过GetLocalTime(&ti)获取当前时间,秒针的角度由实际时间决定,即secondAngle = ti.wSecond * 2 * PI/60。
#include <graphics.h>
#include <conio.h>
#include <cmath>
using namespace std;
struct Point
{
	int x;
	int y;
};
#define High 480
#define Width 640
#define PI 3.1415926
int main(void)
{
	initgraph(Width, High);
	Point center, secondEnd;
	center.x = Width / 2;
	center.y = High / 2;
	int secondLenth = Width / 5;
	secondEnd.x = center.x + secondLenth;
	secondEnd.y = center.y;
	double secondAngle;
	SYSTEMTIME ti;
	while (true)
	{
		GetLocalTime(&ti);
		secondAngle = ti.wSecond * 2 * PI / 60;
		// 由角度决定终点坐标
		secondEnd.x = center.x + secondLenth * sin(secondAngle);
		secondEnd.y = center.y - secondLenth * cos(secondAngle);
		// 画秒针
		setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
		setcolor(WHITE);
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		Sleep(100);
		setcolor(BLACK);
		line(center.x, center.y, secondEnd.x, secondEnd.y);
	}
	_getch();
	closegraph();
	return 0;
}
 

4. 添加时针和分针
第四步添加时针、分针,和秒针变化相比,他们的长度、宽度、颜色、旋转速度有一定的不同。
#include <graphics.h>
#include <conio.h>
#include <cmath>
using namespace std;
struct Point
{
	int x;
	int y;
};
#define High 480
#define Width 640
#define PI 3.1415926
int main(void)
{
	initgraph(Width, High);
	Point center, secondEnd, minuteEnd, hourEnd;
	center.x = Width / 2;
	center.y = High / 2;
	int secondLenth = Width / 5;
	int minuteLenth = Width / 6;
	int hourLenth = Width / 8;
	double secondAngle;
	double minuteAngle;
	double hourAngle;
	SYSTEMTIME ti;
	while (true)
	{
		GetLocalTime(&ti);
		secondAngle = ti.wSecond * 2 * PI / 60;
		minuteAngle = ti.wMinute * 2 * PI / 60;
		hourAngle = (ti.wHour % 12) * 2 * PI / 12;
		// 由角度决定秒针终点坐标
		secondEnd.x = center.x + secondLenth * sin(secondAngle);
		secondEnd.y = center.y - secondLenth * cos(secondAngle);
		// 由角度决定分针终点坐标
		minuteEnd.x = center.x + minuteLenth * sin(minuteAngle);
		minuteEnd.y = center.y - minuteLenth * cos(minuteAngle);
		// 由角度决定时针终点坐标
		hourEnd.x = center.x + hourLenth * sin(hourAngle);
		hourEnd.y = center.y - hourLenth * cos(hourAngle);
		// 画秒针
		setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
		setcolor(WHITE);
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		// 画分针
		setlinestyle(PS_SOLID, 4); // 画实线,宽度为4个像素
		setcolor(BLUE);
		line(center.x, center.y, minuteEnd.x, minuteEnd.y);
		// 画时针
		setlinestyle(PS_SOLID, 6); // 画实线,宽度为6个像素
		setcolor(RED);
		line(center.x, center.y, hourEnd.x, hourEnd.y);
		Sleep(10); // 延时10毫秒
		setcolor(BLACK);
		setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		setlinestyle(PS_SOLID, 4); // 画实线,宽度为4个像素
		line(center.x, center.y, minuteEnd.x, minuteEnd.y);
		setlinestyle(PS_SOLID, 6); // 画实线,宽度为6个像素
		line(center.x, center.y, hourEnd.x, hourEnd.y);
	}
	int c = _getch();
	closegraph();
	return 0;
}
 

5. 添加表盘刻度
第五步绘制表盘,并可以利用outtextxy()函数在画面中输出文字,为了让时针、分针的转动更自然,对求解时针、分针的角度进行了改进。
#include <graphics.h>
#include <conio.h>
#include <cmath>
using namespace std;
struct Point
{
	int x;
	int y;
};
#define High 480
#define Width 640
#define PI 3.1415926
int main(void)
{
	initgraph(Width, High);
	Point center, secondEnd, minuteEnd, hourEnd;
	center.x = Width / 2;
	center.y = High / 2;
	int secondLenth = Width / 5;
	int minuteLenth = Width / 6;
	int hourLenth = Width / 8;
	double secondAngle;
	double minuteAngle;
	double hourAngle;
	SYSTEMTIME ti;
	BeginBatchDraw();
	while (true)
	{
		// 绘制一个简单的表盘
		setlinestyle(PS_SOLID, 1); // 画实线,宽度为1个像素
		setcolor(WHITE);
		circle(center.x, center.y, Width / 4);
		// 画刻度
		int x, y, i;
		for (i = 0; i < 60; i++)
		{
			x = center.x + int(Width/4.3*sin(PI*2*i/60));
			y = center.y - int(Width/4.3*cos(PI*2*i/60));
			if (i % 15 == 0) {
				bar(x - 5, y -5, x + 5, y + 5);
			}
			else if (i % 5 == 0) {
				circle(x, y, 3);
			}
			else {
				putpixel(x, y, WHITE);
			}
		}
		GetLocalTime(&ti);
		secondAngle = ti.wSecond * 2 * PI / 60;
		minuteAngle = ti.wMinute * 2 * PI / 60 + secondAngle / 60;
		hourAngle = ti.wHour*2*PI/12 + minuteAngle / 12;
		// 由角度决定秒针终点坐标
		secondEnd.x = center.x + secondLenth * sin(secondAngle);
		secondEnd.y = center.y - secondLenth * cos(secondAngle);
		// 由角度决定分针终点坐标
		minuteEnd.x = center.x + minuteLenth * sin(minuteAngle);
		minuteEnd.y = center.y - minuteLenth * cos(minuteAngle);
		// 由角度决定时针终点坐标
		hourEnd.x = center.x + hourLenth * sin(hourAngle);
		hourEnd.y = center.y - hourLenth * cos(hourAngle);
		// 画秒针
		setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
		setcolor(WHITE);
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		// 画分针
		setlinestyle(PS_SOLID, 4); // 画实线,宽度为4个像素
		setcolor(BLUE);
		line(center.x, center.y, minuteEnd.x, minuteEnd.y);
		// 画时针
		setlinestyle(PS_SOLID, 6); // 画实线,宽度为6个像素
		setcolor(RED);
		line(center.x, center.y, hourEnd.x, hourEnd.y);
		FlushBatchDraw();
		Sleep(10); // 延时10毫秒
		setcolor(BLACK);
		setlinestyle(PS_SOLID, 2); // 画实线,宽度为2个像素
		line(center.x, center.y, secondEnd.x, secondEnd.y);
		setlinestyle(PS_SOLID, 4); // 画实线,宽度为4个像素
		line(center.x, center.y, minuteEnd.x, minuteEnd.y);
		setlinestyle(PS_SOLID, 6); // 画实线,宽度为6个像素
		line(center.x, center.y, hourEnd.x, hourEnd.y);
	}
	EndBatchDraw();
	int c = _getch();
	closegraph();
	return 0;
}
 

 至此完成。



















