趣味编程:梦幻万花筒

目录

1.效果展示

2.源码展示

3.代码逻辑详解

[3.1 头文件与宏定义](#3.1 头文件与宏定义)

[3.2 HSV函数转RGB颜色函数](#3.2 HSV函数转RGB颜色函数)

[3.3 主函数](#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():清除当前绘图设备。
  • cxcy:计算窗口的中心坐标。
  • angle:全局旋转角度,初始值为 0。
  • hue:颜色色相值,初始值为 0。
  • BeginBatchDraw():开启批量绘制,避免画面闪烁。
循环部分
  • while (!_kbhit()):只要没有按键输入,就持续循环。
  • cleardevice():每次循环都清除绘图设备,为绘制新画面做准备。
  • angle += 0.005fhue += 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)):计算动态半径,使线条有波动效果。
  • startAngleendAngle:计算线条的起点和终点角度。
  • 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.小结

以上便是本篇博客的所有内容,如果大家觉得这篇博客能带来知识,还请给博主点点赞。

相关推荐
机器学习之心10 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
max50060011 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
超级大福宝11 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
王哥儿聊AI12 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-14 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法14 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董14 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone14 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法
杨小码不BUG14 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛
麦麦在写代码15 小时前
动态内存管理 干货2
c语言