C语言结合EasyX库实现动态时钟效果

桃夭
桃夭
发布时间:2026-10-15| 4人浏览过
原创

这篇文章将指导您如何使用C语言中的EasyX图形库(graphics.h)绘制一个动态运行的时钟程序。代码涵盖了窗口初始化、背景设置、刻度绘制以及基于系统时间的指针角度计算。

运行效果与基本原理

程序运行时会在屏幕上显示一个带有刻度的圆形表盘,并包含时针、分针和秒针。核心机制是通过不断获取系统当前时间,将其转换为相应的弧度角,然后使用绘图函数绘制指针。

环境准备与配置参数

本示例依赖 EasyX 库(通常用于C/C++图形开发)。首先需要定义一些基础常量和全局变量:

  • 窗口尺寸:宽640像素,高480像素。
  • 圆心位置:(320, 240)。
  • 圆周率:pi = 3.141592。
  • 指针长度:秒针120px,分针90px,时针60px。
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <time.h>

#define high 480
#define width 640
#define pi 3.141592

// ... 其他变量初始化代码 (见下文)

第1步:初始化窗口与绘制表盘

首先调用 initgraph() 打开图形界面,并根据循环次数重绘背景和基准圆,确保画面整洁。

int main() {
    initgraph(high, width);
    
    // 初始化中心点
    int center_x = height / 2; // 此处原逻辑可能混淆了变量名,建议根据实际窗口高度调整,例如 240
    int center_y = width / 2;  // 对应宽度的一半,如 320

    BeginBatchDraw(); // 开启双缓冲绘图,防止闪烁

    while (1) {
        // 1. 获取系统时间
        SYSTEMTIME ti;
        GetLocalTime(&ti);

        // 2. 设置背景色并清除上一帧残留图像(关键)
        setbkcolor(BLACK);
        cleardevice(); // 清除屏幕以BLACK为背景的颜色
        
        // 绘制表盘外圆
        setlinecolor(WHITE);
        circle(center_x, center_y, 130); // 半径为130
        
        // ... (绘制刻度等后续步骤)
    }
}

注:在每帧循环开始前,必须通过 cleardevice() 或重新填充背景来擦除旧的指针线条,否则会产生重影。

第2步:绘制表盘刻度

我们将表盘分为60份。为了视觉效果区分度更高,不同时间点采用不同的标记方式:

  • 普通分钟:绘制一个小点。
  • 5分钟倍数(非整点):绘制一个小圆圈。
  • 15分钟倍数(即1/4小时处):绘制实心矩形块。

数学公式:利用极坐标转换为直角坐标 x = cx + r * sin(a), y = cy - r * cos(a) (注意坐标系y轴方向)。

第3步:计算指针角度与绘制

这是动画的核心部分。需要将时、分、秒转化为相对于12点钟方向的旋转角度。

原理说明:

在一个圆的坐标系中,12点钟方向对应角度0。顺时针转动角度增加。

以下是各指针的角度计算公式及绘制逻辑:

  1. 秒针 (Yellow, Length=120):
    float secondAngle = ti.wSecond * 2 * pi / 60;
    int secondEnd_x = center_x + secondLenth * sin(secondAngle);
    int secondEnd_y = center_y - secondLenth * cos(secondAngle);
    setlinecolor(YELLOW);
    line(center_x, center_y, secondEnd_x, secondEnd_y); 
  2. 分针 (Blue, Length=90):

    分针不仅取决于分钟数,还会随着秒钟的流逝微小偏移。

    float minuteAngle = ti.wMinute * 2 * pi / 60 + secondAngle / 60;
    int minuteEnd_x = center_x + minuteLenth * sin(minuteAngle);
    int minuteEnd_y = center_y - minuteLenth * cos(minuteAngle);
    setlinecolor(BLUE);
    setlinestyle(PS_SOLID, 3); 
    line(center_x, center_y, minuteEnd_x, minuteEnd_y); 
  3. 时针 (Red, Length=60):

    时针的移动受小时和分钟共同影响,精度要求最高。

    float hoursAngle = ti.wHour * 2 * pi / 12 + minuteAngle / 60;
    int hoursEnd_x = center_x + hoursLenth * sin(hoursAngle);
    int hoursEnd_y = center_y - hoursLenth * cos(hoursAngle);
    setlinecolor(RED);
    setlinestyle(PS_SOLID, 5); 
    line(center_x, center_y, hoursEnd_x, hoursEnd_y); 

关于坐标计算的图解:

理解为何是 sin 和 -cos 以及角度起始点至关重要,这里补充一个详细的示意图帮助理解。

第4步:防闪烁处理与结束

为了确保画面不闪烁且平滑过渡,最后需要执行刷新缓冲区并延时一小段时间。

FlushBatchDraw();      // 将后台画布刷到前台
Sleep(50);             // 延时50ms,降低CPU占用并控制刷新率
} // while loop end

_endbatchdraw();       // 关闭双缓冲
_getch();              // 等待按键输入
closegraph();          // 关闭图形窗口
return 0;

排查与注意事项

如果运行代码时遇到问题,请注意以下几点:

  • 变量名混淆风险:在提供的原始草稿中,center_x = width / 2 而 center_y = high / 2。如果常量定义时 high 代表高度(height)而 width 代表宽度,那么赋值语句可能写反了(即x取了宽的一半,y取了高的一半,虽然数值上没错,但逻辑上不直观),请根据您的实际情况核实变量含义。
  • 头文件链接错误:如果没有配置好EasyX环境,编译时会报错找不到 graphics.h 或 outtextxy 等函数。请确认编译器已正确包含EasyX库。
  • 指针重叠重影:如果在未清除背景的情况下直接绘制新指针,会出现严重的重影。务必使用 cleardevice() 或在每帧开头用纯色覆盖整个画布。
  • 字符集支持:原文中使用了 TCHAR s[] = _T("我的时钟");。这依赖于Unicode设置。如果使用宽字符版EasyX(推荐),请直接使用宽字符串 L"..." 或启用Unicode宏。

以上就是C语言绘制简单时钟程序的详细内容,更多关于C语言图形编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。