目錄
?1.效果展示
2.源碼展示?
3.代碼邏輯詳解
3.1 頭文件與宏定義?
3.2? HSV函數轉RGB顏色函數
?3.3 主函數
初始化部分
循環部分
線條繪制部分
刷新和延時部分
結束部分
4.小結?
本篇博客主要介紹趣味編程用C語言實現萬花筒小程序。
?1.效果展示
?
2.源碼展示?
#define _CRT_SECURE_NO_WARNINGS
#include <graphics.h>
#include <conio.h>
#include <math.h>#define PI acos(-1.0)
#define NUM_LINES 36 // 線條數量
#define BASE_RADIUS 250 // 基礎半徑// HSV轉RGB顏色函數
COLORREF MHSVtoRGB(float H, float S, float V) {float C = V * S;float X = C * (1 - fabs(fmod(H / 60.0, 2) - 1));float m = V - C;float r, g, b;if (H >= 0 && H < 60) { r = C; g = X; b = 0; }else if (H >= 60 && H < 120) { r = X; g = C; b = 0; }else if (H >= 120 && H < 180) { r = 0; g = C; b = X; }else if (H >= 180 && H < 240) { r = 0; g = X; b = C; }else if (H >= 240 && H < 300) { r = X; g = 0; b = C; }else { r = C; g = 0; b = X; }return RGB((r + m) * 255, (g + m) * 255, (b + m) * 255);
}int main() {// 初始化圖形窗口initgraph(800, 600);setbkcolor(BLACK);cleardevice();int cx = getwidth() / 2; // 中心X坐標int cy = getheight() / 2; // 中心Y坐標float angle = 0.0f; // 全局旋轉角度float hue = 0.0f; // 顏色色相值// 啟用批量繪制(防閃爍)BeginBatchDraw();while (!_kbhit()) { // 按任意鍵退出cleardevice();// 更新全局參數angle += 0.005f;hue += 0.5f;if (hue >= 360) hue -= 360;// 繪制所有線條for (int i = 0; i < NUM_LINES; ++i) {// 計算當前線條角度偏移float offset = i * (2 * PI / NUM_LINES);// 計算動態半徑(帶波動效果)float radius = BASE_RADIUS * (1 + 0.2f * sin(angle * 3 + offset));// 計算起點和終點坐標float startAngle = angle + offset;float endAngle = startAngle + PI / 2; // 終點角度偏移90度int x1 = cx + radius * cos(startAngle);int y1 = cy + radius * sin(startAngle);int x2 = cx + (radius * 0.6f) * cos(endAngle);int y2 = cy + (radius * 0.6f) * sin(endAngle);// 設置線條顏色(HSV色彩空間漸變)setlinecolor(MHSVtoRGB(fmod(hue + i * 10, 360), 0.8f, 1.0f));// 繪制線條line(x1, y1, x2, y2);}// 刷新批量繪制FlushBatchDraw();Sleep(10);}// 關閉圖形窗口EndBatchDraw();closegraph();return 0;
}
3.代碼邏輯詳解
3.1 頭文件與宏定義?
#define _CRT_SECURE_NO_WARNINGS
#include <graphics.h>
#include <conio.h>
#include <math.h>#define PI acos(-1.0)
#define NUM_LINES 36 // 線條數量
#define BASE_RADIUS 250 // 基礎半徑
#define _CRT_SECURE_NO_WARNINGS
:這是為了屏蔽 Visual Studio 中一些不安全函數的警告。#include <graphics.h>
:引入 EasyX 圖形庫的頭文件,該庫用于實現圖形繪制。#include <conio.h>
:引入控制臺輸入輸出庫,其中的?_kbhit()
?函數可用于檢測是否有按鍵輸入。#include <math.h>
:引入數學庫,使用其中的數學函數,如?sin()
、cos()
?等。PI
:定義圓周率。NUM_LINES
:設定要繪制的線條數量。BASE_RADIUS
:設定線條繪制的基礎半徑。
3.2? HSV函數轉RGB顏色函數
// HSV轉RGB顏色函數
COLORREF MHSVtoRGB(float H, float S, float V) {float C = V * S;float X = C * (1 - fabs(fmod(H / 60.0, 2) - 1));float m = V - C;float r, g, b;if (H >= 0 && H < 60) { r = C; g = X; b = 0; }else if (H >= 60 && H < 120) { r = X; g = C; b = 0; }else if (H >= 120 && H < 180) { r = 0; g = C; b = X; }else if (H >= 180 && H < 240) { r = 0; g = X; b = C; }else if (H >= 240 && H < 300) { r = X; g = 0; b = C; }else { r = C; g = 0; b = X; }return RGB((r + m) * 255, (g + m) * 255, (b + m) * 255);
}
- 該函數的作用是把 HSV(色相、飽和度、明度)顏色空間的顏色轉換為 RGB 顏色空間的顏色。
H
?代表色相,取值范圍是 0 到 360;S
?代表飽和度,取值范圍是 0 到 1;V
?代表明度,取值范圍是 0 到 1。- 依據?
H
?的不同區間,計算出?r
、g
、b
?的值,最后將其轉換為?RGB
?顏色值。
?3.3 主函數
int main() {// 初始化圖形窗口initgraph(800, 600);setbkcolor(BLACK);cleardevice();int cx = getwidth() / 2; // 中心X坐標int cy = getheight() / 2; // 中心Y坐標float angle = 0.0f; // 全局旋轉角度float hue = 0.0f; // 顏色色相值// 啟用批量繪制(防閃爍)BeginBatchDraw();while (!_kbhit()) { // 按任意鍵退出cleardevice();// 更新全局參數angle += 0.005f;hue += 0.5f;if (hue >= 360) hue -= 360;// 繪制所有線條for (int i = 0; i < NUM_LINES; ++i) {// 計算當前線條角度偏移float offset = i * (2 * PI / NUM_LINES);// 計算動態半徑(帶波動效果)float radius = BASE_RADIUS * (1 + 0.2f * sin(angle * 3 + offset));// 計算起點和終點坐標float startAngle = angle + offset;float endAngle = startAngle + PI / 2; // 終點角度偏移90度int x1 = cx + radius * cos(startAngle);int y1 = cy + radius * sin(startAngle);int x2 = cx + (radius * 0.6f) * cos(endAngle);int y2 = cy + (radius * 0.6f) * sin(endAngle);// 設置線條顏色(HSV色彩空間漸變)setlinecolor(MHSVtoRGB(fmod(hue + i * 10, 360), 0.8f, 1.0f));// 繪制線條line(x1, y1, x2, y2);}// 刷新批量繪制FlushBatchDraw();Sleep(10);}// 關閉圖形窗口EndBatchDraw();closegraph();return 0;
}
初始化部分
initgraph(800, 600)
:初始化一個大小為 800x600 的圖形窗口。setbkcolor(BLACK)
:把窗口背景顏色設置為黑色。cleardevice()
:清除當前繪圖設備。cx
?和?cy
:計算窗口的中心坐標。angle
:全局旋轉角度,初始值為 0。hue
:顏色色相值,初始值為 0。BeginBatchDraw()
:開啟批量繪制,避免畫面閃爍。
循環部分
while (!_kbhit())
:只要沒有按鍵輸入,就持續循環。cleardevice()
:每次循環都清除繪圖設備,為繪制新畫面做準備。angle += 0.005f
?和?hue += 0.5f
:更新全局旋轉角度和顏色色相值。if (hue >= 360) hue -= 360
:確保色相值在 0 到 360 之間循環。
線條繪制部分
for (int i = 0; i < NUM_LINES; ++i)
:循環繪制所有線條。offset = i * (2 * PI / NUM_LINES)
:計算每條線條的角度偏移。radius = BASE_RADIUS * (1 + 0.2f * sin(angle * 3 + offset))
:計算動態半徑,使線條有波動效果。startAngle
?和?endAngle
:計算線條的起點和終點角度。x1
、y1
、x2
、y2
:計算線條的起點和終點坐標。setlinecolor(MHSVtoRGB(fmod(hue + i * 10, 360), 0.8f, 1.0f))
:設置線條顏色,實現 HSV 色彩空間的漸變。line(x1, y1, x2, y2)
:繪制線條。
刷新和延時部分
FlushBatchDraw()
:刷新批量繪制,將繪制的內容顯示在窗口上。Sleep(10)
:延時 10 毫秒,控制動畫的速度。
結束部分
EndBatchDraw()
:結束批量繪制。closegraph()
:關閉圖形窗口。
4.小結?
?以上便是本篇博客的所有內容,如果大家覺得這篇博客能帶來知識,還請給博主點點贊。
?