趣味編程:夢幻萬花筒

目錄

?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?的不同區間,計算出?rgb?的值,最后將其轉換為?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:計算線條的起點和終點角度。
  • x1y1x2y2:計算線條的起點和終點坐標。
  • setlinecolor(MHSVtoRGB(fmod(hue + i * 10, 360), 0.8f, 1.0f)):設置線條顏色,實現 HSV 色彩空間的漸變。
  • line(x1, y1, x2, y2):繪制線條。
刷新和延時部分
  • FlushBatchDraw():刷新批量繪制,將繪制的內容顯示在窗口上。
  • Sleep(10):延時 10 毫秒,控制動畫的速度。
結束部分
  • EndBatchDraw():結束批量繪制。
  • closegraph():關閉圖形窗口。

4.小結?

?以上便是本篇博客的所有內容,如果大家覺得這篇博客能帶來知識,還請給博主點點贊。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件開發各階段的自動化測試技術詳解

引言 在當今快速迭代的軟件開發環境中&#xff0c;自動化測試已成為保證軟件質量、提高測試效率的重要手段。本文將深入探討軟件開發生命周期各個階段的自動化測試技術&#xff0c;包括單元測試、代碼級集成測試、Web Service測試和GUI測試的自動化實現方法。 單元測試的自動…

Elasticsearch:我們如何在全球范圍內實現支付基礎設施的現代化?

作者&#xff1a;來自 Elastic Kelly Manrique SWIFT 和 Elastic 如何應對基礎設施復雜性、誤報問題以及日益增長的合規要求。 金融服務公司在全球范圍內管理實時支付方面面臨前所未有的挑戰。SWIFT&#xff08;Society for Worldwide Interbank Financial Telecommunication -…

day009-用戶管理專題

文章目錄 1. 創建包含時間的文件2. 與用戶相關的文件3. 用戶分類4. 與用戶相關的命令4.1 添加用戶4.2 刪除用戶4.3 查看用戶4.4 修改用戶密碼 5. sudo6. 思維導圖7. 老男孩思想-學習方法 1. 創建包含時間的文件 或$()是替換符號&#xff0c;可以將命令的結果作為字符串或變量的…

shell腳本實現遠程重啟多個服務器

直接deepseek幫寫腳本 remoteReboot.sh #!/bin/bash # 配置文件路徑&#xff08;格式&#xff1a;每行一個服務器地址&#xff09; SERVER_FILE"servers.list" # 讀取服務器列表 mapfile -t SERVERS < "$SERVER_FILE" for server in "${SERVER…

如何利用 QuickAPI 生成 PostgreSQL 樣本測試數據:全面解析與實用指南

目錄 一、什么是 QuickAPI&#xff1f; 二、為什么需要生成樣本測試數據&#xff1f; 三、如何在 QuickAPI 中生成 PostgreSQL 樣本測試數據&#xff1f; 1. 登錄 QuickAPI 平臺 2. 選擇 PostgreSQL 數據庫和目標表 3. 配置樣本數據生成規則 4. 導出或直接插入數據 四、…

黑馬點評day04(分布式鎖-setnx)

4、分布式鎖 4.1 、基本原理和實現方式對比 分布式鎖&#xff1a;滿足分布式系統或集群模式下多進程可見并且互斥的鎖。 分布式鎖的核心思想就是讓大家都使用同一把鎖&#xff0c;只要大家使用的是同一把鎖&#xff0c;那么我們就能鎖住線程&#xff0c;不讓線程并行&#x…

?人工智能在農作物病蟲害識別中的應用前景分析

近年來&#xff0c;全球氣候變化加劇、農業種植規模化發展&#xff0c;農作物病蟲害對糧食安全的威脅日益凸顯。據統計&#xff0c;全球每年因病蟲害造成的農作物損失約占總產量的20%-40%&#xff0c;而傳統依賴人工經驗的防治方式效率低、成本高&#xff0c;難以滿足現代農業需…

C++ 完美轉發

C 完美轉發逐步詳解 1. 問題背景與核心目標 在 C 模板編程中&#xff0c;若直接將參數傳遞給其他函數&#xff0c;參數的 值類別&#xff08;左值/右值&#xff09;和 類型信息&#xff08;如 const&#xff09;可能會丟失。例如&#xff1a; template<typename T> voi…

Midjourney 繪畫 + AI 配音:組合玩法打造爆款短視頻!

一、引言:AI 重構短視頻創作范式 在某短視頻工作室的深夜剪輯室里,資深編導正在為一條古風劇情視頻發愁:預算有限無法實拍敦煌場景,人工繪制分鏡耗時 3 天,配音演員檔期排到一周后。而使用 Midjourney 生成敦煌壁畫風格的場景圖僅需 15 分鐘,AI 配音工具實時生成多角色臺…

AI基礎知識(02):機器學習的任務類型、學習方式、工作流程

03 機器學習(Machine Learning)的任務類型與學習方式 廣義的機器學習主要是一個研究如何讓計算機通過數據學習規律,并利用這些規律進行預測和決策的過程。這里的Machine并非物理意義上的機器,可以理解為計算機軟硬件組織;Learning可以理解為一個系統或平臺經歷了某些過程…

數據結構、刷leetcode返航版--二分5/7

1.排序 快排&#xff1a; 第一章 基礎算法&#xff08;一&#xff09; - AcWing 如何調整范圍 經典二分 遞歸結束條件&#xff1b;條件滿足時&#xff0c;進行處理&#xff1b;遞歸左邊&#xff0c;遞歸右邊 分界點劃分可以是l,r,(lr)/2,但是如果是選l&#xff0c;比如是1…

LeetCode 267:回文排列 II —— Swift 解法全解析

文章目錄 摘要描述題解答案題解代碼分析統計字符頻率判斷是否可能構成回文構建半邊字符數組回溯生成半邊排列 示例測試及結果時間復雜度空間復雜度實際使用場景&#xff1a;回文排列在真實項目里能干啥&#xff1f;文本處理、數據清洗類系統游戲開發&#xff1a;名字合法性驗證…

JumpServer批量添加資產

環境說明&#xff1a;我的環境是H3C網絡設備環境 一、在linux系統環境下通過Python腳本獲取交換機信息&#xff0c;IP地址和設備名稱一一對應&#xff0c;腳本如下&#xff1a; cat get_device-sysname.py import re from netmiko import ConnectHandler from concurrent.fut…

理解字、半字與字節 | 從 CPU 架構到編程實踐的數據類型解析

注&#xff1a;本文為 “字、半字、字節” 相關文章合輯。 略作重排&#xff0c;未全校。 如有內容異常&#xff0c;請看原文。 理解計算機體系結構中的字、半字與字節 在計算機科學中&#xff0c;理解“字 (Word)”、“半字 (Half-Word)”和“字節 (Byte)”等基本數據單元的…

數據庫實驗10 函數存儲

數據庫實驗10 一、實驗目的 掌握函數和存儲過程的定義方法&#xff0c;包括標量函數、表值函數、存儲過程的語法結構。理解函數和存儲過程的作用及原理&#xff0c;區分標量函數與表值函數的應用場景&#xff0c;掌握存儲過程的參數傳遞、邏輯控制和錯誤處理機制。能夠熟練運…

2025 RSAC|大語言模型應用風險與廠商攻防新策略

RSA大會全球影響力及2025年LLM熱議概覽 作為全球規模最大、影響力最深遠的網絡安全盛會之一&#xff0c;RSA大會每年匯聚數萬名業界人士共商安全趨勢。在2025 RSAC上&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;尤其是大型語言模型&#xff08;LLM&#x…

網頁版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安裝MySQL和PyMySQL 安裝MySQL # 在Ubuntu/Debian上安裝 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 啟動MySQL服務 sudo systemctl start mysql sudo systemctl enable mysql 安裝PyMySQL pip install pymysql 使用 apt 安裝 My…

Transformer數學推導——Q55 證明跨層殘差跳躍(Cross-Layer Skip Connections)的信息融合效率

該問題歸類到Transformer架構問題集——殘差與歸一化——殘差連接。請參考LLM數學推導——Transformer架構問題集。 1. 引言 在深度學習的發展歷程中&#xff0c;網絡結構的不斷創新推動著模型性能的持續提升。跨層殘差跳躍&#xff08;Cross-Layer Skip Connections&#xf…

41.尋找缺失的第一個正數:原地哈希算法詳解

文章目錄 引言問題描述方法思路&#xff1a;原地哈希算法算法步驟 完整代碼實現關鍵代碼解析復雜度分析示例說明總結 引言 在算法面試和數據處理中&#xff0c;尋找缺失的第一個正數是一個經典問題。題目要求給定一個未排序的整數數組&#xff0c;找到其中缺失的最小正整數&am…

matlab 中function的用法

matlab 中function的用法 前言介紹1. 基本語法示例&#xff08;1&#xff09;可以直接輸出&#xff08;2&#xff09;調用函數 2.輸入參數和輸出參數示例多輸入參數和輸出參數定義一個函數&#xff0c;計算兩個數的和與差&#xff1a;調用該函數&#xff1a; 3. 默認參數示例 4…