目录 1. 效果展示
2. 源码展示
3. 逻辑概述
3.1 表针绘制函数(DrawHand)
3.2 表盘绘制函数
3.3 主程序逻辑
4. 小结
概述:本篇博客主要介绍简易钟表的绘制。
1. 效果展示
该钟表会随着系统的时间变化而变化,动态的效果还请大家自行演示。
2. 源码展示
// 程序名称:钟表模拟程序(表针形式)#include <graphics.h>
#include <conio.h>
#include <math.h>#define PI 3.1415926536void DrawHand(int hour, int minute, int second)
{double a_hour, a_min, a_sec; // 时、分、秒针的弧度值int x_hour, y_hour, x_min, y_min, x_sec, y_sec; // 时、分、秒针的末端位置// 计算时、分、秒针的弧度值a_sec = second * 2 * PI / 60;a_min = minute * 2 * PI / 60 + a_sec / 60;a_hour = hour * 2 * PI / 12 + a_min / 12;// 计算时、分、秒针的末端位置x_sec = int(120 * sin(a_sec)); y_sec = int(120 * cos(a_sec));x_min = int(100 * sin(a_min)); y_min = int(100 * cos(a_min));x_hour = int(70 * sin(a_hour)); y_hour = int(70 * cos(a_hour));// 画时针setlinestyle(PS_SOLID, 10);setlinecolor(WHITE);line(320 + x_hour, 240 - y_hour, 320 - x_hour / 7, 240 + y_hour / 7);// 画分针setlinestyle(PS_SOLID, 6);setlinecolor(LIGHTGRAY);line(320 + x_min, 240 - y_min, 320 - x_min / 5, 240 + y_min / 5);// 画秒针setlinestyle(PS_SOLID, 2);setlinecolor(RED);line(320 + x_sec, 240 - y_sec, 320 - x_sec / 3, 240 + y_sec / 3);
}void DrawDial()
{// 绘制一个简单的表盘circle(320, 240, 2);circle(320, 240, 60);circle(320, 240, 160);outtextxy(296, 310, _T("Susea&"));// 绘制刻度int x, y;for (int i = 0; i < 60; i++){x = 320 + int(145 * sin(PI * 2 * i / 60));y = 240 + int(145 * cos(PI * 2 * i / 60));if (i % 15 == 0)solidrectangle(x - 5, y - 5, x + 5, y + 5);else if (i % 5 == 0)circle(x, y, 3);elseputpixel(x, y, WHITE);}
}int main()
{initgraph(640, 480); // 初始化 640 x 480 的绘图窗口DrawDial(); // 绘制表盘setrop2(R2_XORPEN); // 设置 XOR 绘图模式// 绘制表针SYSTEMTIME ti; // 定义变量保存当前时间while (!_kbhit()) // 按任意键退出钟表程序{GetLocalTime(&ti); // 获取当前时间DrawHand(ti.wHour, ti.wMinute, ti.wSecond); // 画表针Sleep(1000); // 延时 1 秒DrawHand(ti.wHour, ti.wMinute, ti.wSecond); // 擦表针(擦表针和画表针的过程是一样的)}closegraph(); // 关闭绘图窗口return 0;
}
3. 逻辑概述
3.1 表针绘制函数(DrawHand)
void DrawHand(int hour, int minute, int second)
{double a_hour, a_min, a_sec; // 时、分、秒针的弧度值int x_hour, y_hour, x_min, y_min, x_sec, y_sec; // 时、分、秒针的末端位置// 计算时、分、秒针的弧度值a_sec = second * 2 * PI / 60;a_min = minute * 2 * PI / 60 + a_sec / 60;a_hour = hour * 2 * PI / 12 + a_min / 12;// 计算时、分、秒针的末端位置x_sec = int(120 * sin(a_sec)); y_sec = int(120 * cos(a_sec));x_min = int(100 * sin(a_min)); y_min = int(100 * cos(a_min));x_hour = int(70 * sin(a_hour)); y_hour = int(70 * cos(a_hour));// 画时针setlinestyle(PS_SOLID, 10);setlinecolor(WHITE);line(320 + x_hour, 240 - y_hour, 320 - x_hour / 7, 240 + y_hour / 7);// 画分针setlinestyle(PS_SOLID, 6);setlinecolor(LIGHTGRAY);line(320 + x_min, 240 - y_min, 320 - x_min / 5, 240 + y_min / 5);// 画秒针setlinestyle(PS_SOLID, 2);setlinecolor(RED);line(320 + x_sec, 240 - y_sec, 320 - x_sec / 3, 240 + y_sec / 3);
}
- 角度计算:将时、分、秒转换为弧度值
- 秒针:每秒转动
2π/60
弧度 - 分针:每分钟转动
2π/60
弧度,并加上秒针的微小偏移 - 时针:每小时转动
2π/12
弧度,并加上分针的微小偏移
- 秒针:每秒转动
- 坐标计算:使用三角函数计算表针末端坐标
x = r * sin(angle)
y = r * cos(angle)
- 绘制表针:
- 时针:粗线 (10px)、白色、长度 70px
- 分针:中线 (6px)、浅灰色、长度 100px
- 秒针:细线 (2px)、红色、长度 120px
逻辑概述:
- 定义了一些变量来存储时针、分针、秒针的弧度值以及它们的末端位置坐标。
- 计算时针、分针、秒针的弧度值:
)a_sec
为秒针的弧度值,根据秒数乘以2 * PI / 60
计算得出。)a_min
为分针的弧度值,根据分数乘以2 * PI / 60
再加上秒针弧度值的六十分之一计算得出。)a_hour
为时针的弧度值,根据小时数乘以2 * PI / 12
再加上分针弧度值的十二分之一计算得出。- 计算时针、分针、秒针的末端位置坐标:
- )通过相应的弧度值和长度计算出
x
和y
坐标。- 分别绘制时针、分针和秒针:
- )使用
setlinestyle
和setlinecolor
设置线条样式和颜色。- )使用
line
函数根据计算出的坐标绘制线条来表示时针、分针和秒针。
3.2 表盘绘制函数
void DrawDial()
{// 绘制一个简单的表盘circle(320, 240, 2);circle(320, 240, 60);circle(320, 240, 160);outtextxy(296, 310, _T("Susea&"));// 绘制刻度int x, y;for (int i = 0; i < 60; i++){x = 320 + int(145 * sin(PI * 2 * i / 60));y = 240 + int(145 * cos(PI * 2 * i / 60));if (i % 15 == 0)solidrectangle(x - 5, y - 5, x + 5, y + 5);else if (i % 5 == 0)circle(x, y, 3);elseputpixel(x, y, WHITE);}
}
- 基本元素:
- 中心小圆点
- 内外两个圆环 (半径 60px 和 160px)
- 底部文字标识 "Susea&"
- 刻度绘制:
- 整点刻度 (0,15,30,45):实心方块 (10x10px)
- 5 分钟刻度:小圆圈 (半径 3px)
- 普通刻度:单个像素点
逻辑概述:
- 绘制了三个同心圆,分别位于坐标
(320, 240)
处,半径分别为2
、60
和160
。- 在坐标
(296, 310)
处显示文本_T("Susea&")
。- 使用循环绘制刻度:
- )通过循环计算每个刻度的坐标
(x, y)
,根据角度i
和三角函数计算得出。- )对于每一个刻度,根据其在表盘上的位置进行不同的绘制:
- 如果
i
能被15
整除,绘制一个实心矩形作为大刻度。- 如果
i
能被5
整除,绘制一个半径为3
的圆作为中刻度。- 其他刻度则使用
putpixel
函数绘制一个白色像素点作为小刻度。
3.3 主程序逻辑
int main()
{initgraph(640, 480); // 初始化 640 x 480 的绘图窗口DrawDial(); // 绘制表盘setrop2(R2_XORPEN); // 设置 XOR 绘图模式// 绘制表针SYSTEMTIME ti; // 定义变量保存当前时间while (!_kbhit()) // 按任意键退出钟表程序{GetLocalTime(&ti); // 获取当前时间DrawHand(ti.wHour, ti.wMinute, ti.wSecond); // 画表针Sleep(1000); // 延时 1 秒DrawHand(ti.wHour, ti.wMinute, ti.wSecond); // 擦表针(擦表针和画表针的过程是一样的)}closegraph(); // 关闭绘图窗口return 0;
}
- 初始化:创建 640x480 的绘图窗口,绘制静态表盘
- XOR 绘图模式:使用异或模式绘制表针,实现表针的自动擦除
- 实时更新:
- 获取系统时间
- 绘制当前表针位置
- 延时 1 秒
- 再次绘制相同表针 (利用 XOR 模式擦除之前的表针)
- 退出机制:按任意键终止程序
逻辑概述:
- 使用
initgraph
函数初始化一个640 x 480
的绘图窗口。- 调用
DrawDial
函数绘制表盘。- 设置
XOR
绘图模式。- 通过一个循环实现钟表的动态显示:
- )定义
SYSTEMTIME
类型的变量ti
来保存当前时间。- )在循环中,使用
GetLocalTime
函数获取当前时间,并将其作为参数传递给DrawHand
函数来绘制表针。- )使用
Sleep
函数进行 1 秒的延时。- )再次调用
DrawHand
函数来擦除之前绘制的表针(因为XOR
绘图模式的特性,相同的操作会产生擦除的效果)。当用户按下任意键时,循环结束,使用
closegraph
函数关闭绘图窗口并返回0
。
4. 小结
以上便是本篇博客的所有内容,如果大家觉得本篇博客能给大家带来知识,还请给博主点点赞!!!