📜  C程序使用图形创建钟摆时钟(1)

📅  最后修改于: 2023-12-03 14:40:26.521000             🧑  作者: Mango

C程序使用图形创建钟摆时钟

介绍

本文将介绍如何使用C程序和图形库创建一个钟摆时钟。该程序将在图形界面上显示一个钟摆时钟,其中钟摆将会以恒定速度摆动,并且时针、分针和秒针将会按照正确的时间显示。

在本文中,我们将使用graphics.h库来创建图形界面。该库只能在Windows平台下使用,因此此程序仅适用于Windows操作系统。

程序设计

程序需要使用以下头文件:

#include <graphics.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

接下来需要定义一些常量和变量,如下:

// 时钟圆的中心坐标
#define XC 320
#define YC 240

// 时针、分针和秒针的长度
#define HRADIUS 100
#define MRADIUS 140
#define SRADIUS 160

// pi值
#define PI 3.14159265359

// 时分秒
int hour, minute, second;

main函数中,需要初始化图形窗口:

int main()
{
    // 初始化图形库
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "");

    // 绘制时钟
    drawClock();

    // 关闭图形库
    getch();
    closegraph();

    return 0;
}

接下来,需要实现一个函数drawClock来绘制时钟。该函数应该绘制一个空心圆,并在圆的中心绘制一个圆点作为时钟的中心。

void drawClock()
{
    // 绘制圆
    circle(XC, YC, 200);

    // 绘制中心点
    setfillstyle(SOLID_FILL, BLACK);
    fillellipse(XC, YC, 5, 5);
}

接下来,我们需要实现一个函数drawHand来绘制指针。该函数会接收一个参数angle,该参数为指针的角度(以度为单位)。角度从12点方向开始计算,顺时针方向为正向。

void drawHand(int length, int angle)
{
    int x, y;

    // 计算指针的终点坐标
    x = XC + length * sin(angle * PI / 180);
    y = YC - length * cos(angle * PI / 180);

    // 绘制指针
    setlinestyle(SOLID_LINE, 0, 2);
    line(XC, YC, x, y);
}

然后我们需要实现一个函数updateHands来更新指针的角度。该函数会获取当前时间,并将其转换为各个指针的角度,最后调用drawHand函数来绘制指针。

void updateHands()
{
    // 获取当前时间
    time_t now = time(NULL);
    struct tm *tm = localtime(&now);

    // 计算角度
    hour = tm->tm_hour % 12 * 30 + tm->tm_min / 2;
    minute = tm->tm_min * 6;
    second = tm->tm_sec * 6;

    // 绘制指针
    drawHand(HRADIUS, hour);
    drawHand(MRADIUS, minute);
    drawHand(SRADIUS, second);
}

最后,我们需要实现一个函数runClock来让时钟运转起来。该函数会调用updateHands函数来更新指针的角度,然后再等待1秒钟再次更新。

void runClock()
{
    while (1)
    {
        updateHands();
        delay(1000);
        cleardevice();
        drawClock();
    }
}
完整程序
#include <graphics.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

// 时钟圆的中心坐标
#define XC 320
#define YC 240

// 时针、分针和秒针的长度
#define HRADIUS 100
#define MRADIUS 140
#define SRADIUS 160

// pi值
#define PI 3.14159265359

// 时分秒
int hour, minute, second;

// 绘制圆
void drawClock()
{
    circle(XC, YC, 200);

    // 绘制中心点
    setfillstyle(SOLID_FILL, BLACK);
    fillellipse(XC, YC, 5, 5);
}

// 绘制指针
void drawHand(int length, int angle)
{
    int x, y;

    x = XC + length * sin(angle * PI / 180);
    y = YC - length * cos(angle * PI / 180);

    setlinestyle(SOLID_LINE, 0, 2);
    line(XC, YC, x, y);
}

// 更新指针
void updateHands()
{
    time_t now = time(NULL);
    struct tm *tm = localtime(&now);

    hour = tm->tm_hour % 12 * 30 + tm->tm_min / 2;
    minute = tm->tm_min * 6;
    second = tm->tm_sec * 6;

    drawHand(HRADIUS, hour);
    drawHand(MRADIUS, minute);
    drawHand(SRADIUS, second);
}

// 运转时钟
void runClock()
{
    while (1)
    {
        updateHands();
        delay(1000);
        cleardevice();
        drawClock();
    }
}

// 程序入口
int main()
{
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "");

    drawClock();

    runClock();

    getch();
    closegraph();

    return 0;
}
总结

在本文中,我们介绍了如何使用C程序和图形库创建一个钟摆时钟。该程序会在图形界面中显示一个钟表,并根据当前时间更新指针的位置。该程序可以让读者更深入地了解如何使用图形库来创建图形界面,并且也可以作为初学者的练习项目。