当前位置: 首页 > news >正文

【EasyX】实时时钟

目录

  • 实时时钟
    • 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 640int 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;
}

1

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.1415926int 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;
}

2

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.1415926int 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;
}

3

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.1415926int 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;
}

4

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.1415926int 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;
}

5
至此完成。

相关文章:

【EasyX】实时时钟

目录 实时时钟1. 绘制静态秒针2. 秒针的转动3. 根据实际时间转动4. 添加时针和分针5. 添加表盘刻度 实时时钟 本博客介绍利用EasyX实现一个实时钟表的小程序&#xff0c;同时学习时间函数的使用。 本文源码可从github获取 1. 绘制静态秒针 第一步定义钟表的中心坐标center&a…...

基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)

GMSL 图像采集卡 特性 ● PCIe Gen2.0 X8 总线&#xff1b; ● 支持V4L2调用&#xff1b; ● 1路CAN接口&#xff1b; ● 6路/12路 GMSL1/2摄像头输入&#xff0c;最高可达8MP&#xff1b; ● 2路可定义相机同步触发输入/输出&#xff1b; 优势 ● 采用PCIe主卡与FMC子…...

Kibana:使用 Kibana 自带数据进行可视化(一)

在今天的练习中&#xff0c;我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack&#xff0c;你可以参考如下的视频来开启 Elastic Stack 并进行下面的练习。你可以开通阿里云检…...

MySQL数据库基础 07

第七章 单行函数 1. 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类 2. 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换 3. 字符串函数4. 日期和时间函数4.1 获取日期、时间 4.2 日期与时间戳的转换 4.3 获…...

JVM | JVM垃圾回收

JVM | JVM垃圾回收 1、堆空间的基本结构2、内存分配和回收原则2.1、对象优先在 Eden 区分配2.2、大对象直接进入老年代2.3、长期存活的对象将进入老年代2.4、主要进行 gc 的区域2.5、空间分配担保3、死亡对象判断方法3.1、引用计数法3.2、可达性分析算法3.3、引用类型总结3.4、…...

avive零头撸矿

Avive 是一个透明的、自下而上替代自上而下的多元网络&#xff0c;旨在克服当前生态系统的局限性&#xff0c;实现去中心化社会。 aVive&#xff1a;一个基于 SBT 和市场的 deSoc&#xff0c;它使 dapps 能够与分散的位置 oracle 和 SBT 关系进行互操作。您的主权社交网络元宇宙…...

openGauss5.0之学习环境 Docker安装

文章目录 0.前言1. 准备软硬件安装环境1.1 软硬件环境要求1.2 修改操作系统配置1.2.1 关闭操作系统防火墙 1.3 设置字符集参数1.4 设置时区和时间&#xff08;可选&#xff09;关闭swap交换内存1.5 关闭RemoveIPC1.6 关闭HISTORY记录 2. 容器安装2. 1支持的架构和操作系统版本2…...

数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

项目需求 录入进入房间的相关数据&#xff1b;从进入时间开始计时&#xff0c;计算滞留房间的时间&#xff1b;定时刷新数据&#xff0c;超过30分钟的人数&#xff0c;进行红色告警&#xff1b; 实现流程 为了完整地实现上述需求&#xff0c;我们可以按照以下步骤开发&#…...

【Linux】-关于调试器gdb的介绍和使用

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、Linux中的debug和release二、gdb的使用**1.进入调试****2.显示代码*…...

项目开发经验

hadoop 1.namenode中有专门的工作线程池用于处理与datanode的心跳信号 dfs.namenode.handler.count20 * log2(Clust 2.编辑日志存储路径 dfs.namenode.edits.dir 设置与镜像文件存储路径 dfs.namenode分开存放&#xff0c;可以达到提高并发 3.yarn参数调优&#xff0c;单个服…...

STM32——05-按键、时钟控制、中断复位 点亮LED灯

如何点亮一颗LED灯 编程实现点灯 常用的 GPIO HAL 库函数&#xff1a; void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init ); void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState PinState ); void HAL_GPIO_Togg…...

VBA下载二进制文件,文本读写

这里使用了vba如下两个对象&#xff1a; Microsoft.XMLHTTP&#xff1a;文件读写&#xff0c;可读写二进制&#xff0c;可指定编码,对于utf-8编码文本文件使用FSO的TextStream对象打开&#xff0c;读取到的内容可能会出现乱码&#xff0c;可以使用该对象打开;前期绑定添加引用…...

MongoDB结合Robo 3T 1.4.3的简单操作

MongoDB的简单操作结合Robo 3T 1.4.3工具进行查询。 常用的正则表达式 /* 29 */ 正则表达式 /\* [0-9]* \*/ "_id" : ObjectId("5f3d05cdfd2aa9a8a7"), 正则表达式 \"([^\"]*_id)\".*, 使用方法&#xff1a;查询结果去掉注释和不需要…...

【学习笔记】[AGC048D] Pocky Game

这是一个非平等博弈。但是只要求你判断胜负&#xff0c;本身也不是一道结论题&#xff0c;所以可以用 D P DP DP来解决。 结论&#xff1a;第一堆石子剩的越多&#xff0c;先手玩家获胜的概率越大。这直接引出了一个非常感性的结论&#xff1a;每次取石子时要么取一堆&#xf…...

Qgis中进行Shp和Excel属性连接实现百强县公共预算空间分析

前言 在之前的博文中&#xff0c;将2022的全国百强县一般公共预算收入的数据下载到了本地&#xff0c;博客原文地址&#xff1a;一种使用Java的快速将Web中表格转换成Excel的方法。对于不关注时空位置关系的一般分析&#xff0c;到此也就基本够用了。但是&#xff0c;如果站在全…...

ES6 新增的循环方法

在 ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;新增了一些循环方法&#xff0c;这些方法可以帮助我们更方便地遍历数组、字符串、Set、Map 等数据结构。本文将介绍一些常用的 ES6 循环方法。 for…of 循环 for…of 循环是一种遍历可迭代对象的方法&#xff0c…...

移动端事件300ms延迟解决

有移动端与PC端的项目开发&#xff0c;那么移动端和PC端开发上是存在差异的&#xff0c;比如 click 事件的300ms 延迟&#xff0c;即移动Web页面上的click事件响应都要慢上300ms&#xff0c;移动设备访问Web页面时往往需要 “双击” 或者 “捏开” 来放大页面看清页面的具体内容…...

NRF52832的DFU

开发环境&#xff1a; Winsodw&#xff1a;10 nRF5_SDK&#xff1a;17.1.0 1 工具安装 1.1 gcc-arm-none-eabi Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer 下载“gcc-arm-none-eabi-10.3-2021.10-win32.exe”&#xff0c;接提示安装。注意安装完…...

开源WebRTC库放大器模式在采集桌面图像时遇到的DPI缩放与内存泄漏问题排查

目录 1、在非100%的显示比例下放大器采集到的桌面图像不全问题 1.1、通过manifest文件禁止系统对软件进行缩放 1.2、调用SetThreadDpiAwarenessContext函数&#xff0c;禁止系统对目标线程中的窗口进行缩放 1.3、使用winver命令查看Windows的年月版本 2、使用放大器模式遇…...

敲黑板!java反射机制和原理

获取Class对象&#xff1a;首先&#xff0c;你需要获取表示要操作的类的Class对象。可以使用以下三种方式之一来获取Class对象&#xff1a; Class.forName()方法&#xff1a;使用类的全限定名获取Class对象&#xff0c;例如&#xff1a;Class<? Class<?> clazz MyC…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...