趣味編程:鐘表

目錄? ? ? ? ? ??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.pswp.cn/news/905615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905615.shtml
英文地址,請注明出處:http://en.pswp.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;養…