趣味编程:钟表

目录            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

逻辑概述: 

  1. 定义了一些变量来存储时针、分针、秒针的弧度值以及它们的末端位置坐标。
  2. 计算时针、分针、秒针的弧度值:
    • )a_sec 为秒针的弧度值,根据秒数乘以 2 * PI / 60 计算得出。
    • )a_min 为分针的弧度值,根据分数乘以 2 * PI / 60 再加上秒针弧度值的六十分之一计算得出。
    • )a_hour 为时针的弧度值,根据小时数乘以 2 * PI / 12 再加上分针弧度值的十二分之一计算得出。
  3. 计算时针、分针、秒针的末端位置坐标:
    • )通过相应的弧度值和长度计算出 x 和 y 坐标。
  4. 分别绘制时针、分针和秒针:
    • )使用 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)
    • 普通刻度:单个像素点

逻辑概述:

  1. 绘制了三个同心圆,分别位于坐标 (320, 240) 处,半径分别为 260 和 160
  2. 在坐标 (296, 310) 处显示文本 _T("Susea&") 。
  3. 使用循环绘制刻度
    • )通过循环计算每个刻度的坐标 (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. 获取系统时间
    2. 绘制当前表针位置
    3. 延时 1 秒
    4. 再次绘制相同表针 (利用 XOR 模式擦除之前的表针)
  • 退出机制:按任意键终止程序

逻辑概述: 

  1. 使用 initgraph 函数初始化一个 640 x 480 的绘图窗口。
  2. 调用 DrawDial 函数绘制表盘。
  3. 设置 XOR 绘图模式
  4. 通过一个循环实现钟表的动态显示
    • )定义 SYSTEMTIME 类型的变量 ti 来保存当前时间。
    • )在循环中,使用 GetLocalTime 函数获取当前时间,并将其作为参数传递给 DrawHand 函数来绘制表针。
    • )使用 Sleep 函数进行 1 秒的延时。
    • )再次调用 DrawHand 函数来擦除之前绘制的表针(因为 XOR 绘图模式的特性,相同的操作会产生擦除的效果)。
  5. 当用户按下任意键时,循环结束,使用 closegraph 函数关闭绘图窗口并返回 0

4. 小结

以上便是本篇博客的所有内容,如果大家觉得本篇博客能给大家带来知识,还请给博主点点赞!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible进阶02

管理主机清单变量 使用变量的原则 变量创建的位置 角色的defaults或vars目录主机清单playbook或主机清单所在位置的子目录group_vars和host_varsplay或角色或任务 无论在哪创建变量&#xff0c;都应该遵守一些规则&#xff1a; 保持简洁不要重复造轮子。不要反复在多个位置…

C40-指针

一 指针的引入 什么是指针:指针是一个变量&#xff0c;其值是另一个变量的内存地址 简单的使用地址输出一个变量: 代码示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*号是取值运算符…

Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查

Nginx 返回 504 状态码表示 网关超时&#xff08;Gateway Timeout&#xff09;&#xff0c;这意味着 Nginx 作为反向代理服务器&#xff0c;在等待上游服务器&#xff08;如后端应用服务器、数据库服务器等&#xff09;响应时&#xff0c;超过了预设的时间限制&#xff0c;最终…

DeepSeek推理优化技巧:提升速度与降低成本

文章目录 DeepSeek推理优化技巧&#xff1a;提升速度与降低成本引言一、模型优化&#xff1a;减少模型参数与计算量1. 模型剪枝&#xff08;Pruning&#xff09;2. 模型量化&#xff08;Quantization&#xff09;3. 知识蒸馏&#xff08;Knowledge Distillation&#xff09; 二…

深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】

一、技术架构与核心能力解析 1.1 时空建模体系的创新突破 Sora 在视频生成领域的核心优势源于其独特的时空建模架构。区别于传统将视频拆解为单帧处理的模式,Sora 采用时空 Patch 嵌入技术,将连续视频序列分割为 32x32 像素的时空块(每个块包含相邻 3 帧画面),通过线性投…

【实战篇】数字化打印——打印部署管理接口开发

前言 前面的章节已经介绍了打印管理模块的主要界面设计&#xff0c;本篇介绍用myBuilder开发界面接口&#xff0c;实现最终的功能。 1. 配置打印应用菜单 首先配置挂载好模块菜单 让菜单点击能访问到对应的页面 2. 打印部署管理数据表详细设计 以下是打印部署管理的数据表字…

Window下Jmeter多机压测方法

1.概述 Jmeter多机压测的原理&#xff0c;是通过单个jmeter客户端&#xff0c;控制多个远程的jmeter服务器&#xff0c;使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于&#xff1a; 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…

ResourceBundle多语言国际化

在 Java 中&#xff0c;ResourceBundle 是一个用于国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;的一种机制&#xff0c;它使得程序能够根据不同的区域设置&#xff08;如语言、国家等&#xff09;加载不同的资源文件。ResourceBundle 主要用于从外…

精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶

精益数据分析&#xff08;62/126&#xff09;&#xff1a;从客户访谈评分到市场规模估算——移情阶段的实战进阶 在创业的移情阶段&#xff0c;科学评估用户需求与市场潜力是决定产品方向的关键。今天&#xff0c;我们结合Cloud9 IDE的实战经验与《精益数据分析》的方法论&…

第四天——贪心算法——种花

1. 题目 有一个花坛&#xff0c;其中0 表示该位置是空的&#xff0c;可以种花。1 表示该位置已经有花&#xff0c;不能种花。 规则&#xff1a;新种的花不能种在相邻的位置&#xff08;即如果某个位置已经种了花&#xff0c;它的左右两个相邻位置不能再种花&#xff09;。给定…

【重磅】配电网智能软开关和储能联合规划

目录 1 主要内容 目标函数 数据说明 节点系统图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《具有源荷不平衡特性的配电网智能软开关和储能联合规划》部分模型&#xff0c;未考虑聚类分析和分布鲁棒部分&#xff0c;就智能软开关和储能联合规划部分进行了…

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示 📢 前言: 作为一名键盘爱好者,近期研究了QMK固件的OLED显示屏配置,发现网上的教程要么太过复杂,要么过于简单无法实际操作。因此决定写下这篇教程,从零基础出发,带大家一步步实现键盘OLED屏幕的配置与个性化显示…

中国科学院计算所:从 NFS 到 JuiceFS,大模型训推平台存储演进之路

中科院计算所在建设大模型训练与推理平台过程中&#xff0c;模型规模与数据集数量呈爆发式增长。最初采用简单的裸机存储方案&#xff0c;但很快面临数据孤岛、重复冗余、管理混乱和资源利用不均等问题&#xff0c;于是升级到了 NFS 系统。然而&#xff0c;随着使用强度增加&am…

飞牛NAS本地部署开源TTS文本转语音工具EasyVoice与远程使用流程

文章目录 前言1. 环境准备2. Docker部署与运行3. 简单使用测试4. 安装内网穿透4.1 开启ssh连接安装cpolar4.2 创建公网地址 5. 配置固定公网地址总结 前言 本文主要介绍如何在fnOS飞牛云NAS使用Docker本地部署一款非常好用的开源TTS文本转语音工具EasyVoice&#xff0c;并结合…

部署安装jenkins.war(2.508)

实验目的&#xff1a;部署jenkins&#xff0c;并与gitlab关联bulid 所需软件&#xff1a;jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机&#xff1a;8.10具有java环境,内存最少为4G&#xff0c;cpu双核 目录 jdk安装 …

AEO认证的好处 ,如何快速获取AEO认证?

AEO认证的好处及快速获取方法 AEO&#xff08;Authorized Economic Operator&#xff0c;经认证的经营者&#xff09; 是海关对符合国际供应链安全标准的企业给予的认证&#xff0c;分为 AEO一般认证 和 AEO高级认证。获得AEO认证可享受多项通关便利&#xff0c;提升企业国际贸…

(01)数字化转型之采购管理:从计划到退货的精细化管控

引言&#xff1a;采购管理对企业运营的关键作用 在当今竞争激烈的商业环境中&#xff0c;采购管理已成为企业成本控制和供应链优化的核心环节。一项研究显示&#xff0c;采购成本通常占企业总成本的60%-80%&#xff0c;而高效的采购管理可帮助企业降低5%-15%的采购成本。本文将…

技术视界 | 青龙机器人训练地形详解(四):复杂地形精讲之斜坡

在前几篇文章中&#xff0c;我们依次讲解了如何创建一个地形、如何将地形添加到训练环境中&#xff0c;并在上一期深入分析了复杂地形之一——台阶地形的创建方式与训练意义。本文将继续聚焦复杂地形训练中另一类代表性地形——斜坡&#xff08;Slope&#xff09;与金字塔斜坡&…

【MySQL】多表连接查询

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 多表连接查询概述1.1 连接查询的作用1.2 MySQL支持的连接类型 2. 内连接 (INNER JOIN)2.1 内连接的特点2.2 内连接语法2.3 内连接实例2.4 多表内连接 3. 左外连接 (LEFT JOIN)3.1 左外连接的特点3.2 左外连接…

养猪场巡检机器人的设计与应用研究

摘要 本论文针对传统养猪场人工巡检效率低、劳动强度大、数据准确性差等问题&#xff0c;设计了一种适用于养猪场的巡检机器人。详细阐述了该机器人的设计思路、技术原理、系统组成及功能特点&#xff0c;并通过实际应用案例分析其在养猪场中的应用效果。研究表明&#xff0c;养…