目錄? ? ? ? ? ??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
邏輯概述:?
- 定義了一些變量來存儲時針、分針、秒針的弧度值以及它們的末端位置坐標。
- 計算時針、分針、秒針的弧度值:
)a_sec
?為秒針的弧度值,根據秒數乘以?2 * PI / 60
?計算得出。)a_min
?為分針的弧度值,根據分數乘以?2 * PI / 60
?再加上秒針弧度值的六十分之一計算得出。)a_hour
?為時針的弧度值,根據小時數乘以?2 * PI / 12
?再加上分針弧度值的十二分之一計算得出。- 計算時針、分針、秒針的末端位置坐標:
- )通過相應的弧度值和長度計算出?
x
?和?y
?坐標。- 分別繪制時針、分針和秒針:
- )使用?
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)
- 普通刻度:單個像素點
邏輯概述:
- 繪制了三個同心圓,分別位于坐標?
(320, 240)
?處,半徑分別為?2
、60
?和?160
。- 在坐標?
(296, 310)
?處顯示文本?_T("Susea&")
?。- 使用循環繪制刻度:
- )通過循環計算每個刻度的坐標?
(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 秒
- 再次繪制相同表針 (利用 XOR 模式擦除之前的表針)
- 退出機制:按任意鍵終止程序
邏輯概述:?
- 使用?
initgraph
?函數初始化一個?640 x 480
?的繪圖窗口。- 調用?
DrawDial
?函數繪制表盤。- 設置?
XOR
?繪圖模式。- 通過一個循環實現鐘表的動態顯示:
- )定義?
SYSTEMTIME
?類型的變量?ti
?來保存當前時間。- )在循環中,使用?
GetLocalTime
?函數獲取當前時間,并將其作為參數傳遞給?DrawHand
?函數來繪制表針。- )使用?
Sleep
?函數進行 1 秒的延時。- )再次調用?
DrawHand
?函數來擦除之前繪制的表針(因為?XOR
?繪圖模式的特性,相同的操作會產生擦除的效果)。當用戶按下任意鍵時,循環結束,使用?
closegraph
?函數關閉繪圖窗口并返回?0
。
4. 小結
以上便是本篇博客的所有內容,如果大家覺得本篇博客能給大家帶來知識,還請給博主點點贊!!!
?