目录
[3.1 头文件与宏定义](#3.1 头文件与宏定义)
[3.2 HSV函数转RGB颜色函数](#3.2 HSV函数转RGB颜色函数)
[3.3 主函数](#3.3 主函数)
本篇博客主要介绍趣味编程用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.小结
以上便是本篇博客的所有内容,如果大家觉得这篇博客能带来知识,还请给博主点点赞。
