EasyX 测试颜色渐变代码

让AI 给我写了一个颜色渐变的算法,代码如下:

#include <graphics.h>  // EasyX图形库头文件
#include <conio.h>     // 用于_getch()
#include <math.h>    
#include <stdio.h>  
#include <cstdio>
#include <conio.h>
#include <tchar.h>

// HSL转RGB辅助函数
void HSLtoRGB(float h, float s, float l, BYTE& r, BYTE& g, BYTE& b) {
    float q = l < 0.5 ? l * (1 + s) : l + s - l * s;
    float p = 2 * l - q;
    float t[3] = { h + 1 / 3.0f, h, h - 1 / 3.0f };

    for (int i = 0; i < 3; ++i) {
        if (t[i] < 0) t[i] += 1;
        if (t[i] > 1) t[i] -= 1;

        if (t[i] < 1 / 6.0f)
            t[i] = p + (q - p) * 6 * t[i];
        else if (t[i] < 0.5f)
            t[i] = q;
        else if (t[i] < 2 / 3.0f)
            t[i] = p + (q - p) * 6 * (2 / 3.0f - t[i]);
        else
            t[i] = p;
    }

    r = static_cast<BYTE>(t[0] * 255);
    g = static_cast<BYTE>(t[1] * 255);
    b = static_cast<BYTE>(t[2] * 255);
}

// 在视图类中定义成员变量
float m_currentHue = 0.0f;        // 当前色相值 [0,1]
float m_targetHue = 0.0f;         // 目标色相值 [0,1]
float m_transitionSpeed = 0.1f; // 颜色过渡速度


int main()
{
    char Buffer[256];
    // 初始化640x480像素的图形窗口
    initgraph(640, 480);

    for (int i = 0; i < 60*30; i++) {
        BeginBatchDraw();
        cleardevice();
        // 线性插值过渡
        m_currentHue += (m_targetHue - m_currentHue) * m_transitionSpeed;

        // 到达目标时生成新随机目标
        if (fabs(m_targetHue - m_currentHue) < 0.001f) {
            m_targetHue = static_cast<float>(rand() % 1000) / 1000.0f;
        }

        BYTE r, g, b;
        HSLtoRGB(m_currentHue, 0.7f, 0.5f, r, g, b); // 固定饱和度和亮度
        printf("[%f]->%d  %d  %d\n", m_currentHue,r, g, b);
        setbkcolor(RGB(r, g, b));
        EndBatchDraw();
       
        sprintf_s(Buffer, sizeof(Buffer), "output\\%05d.png", i);
        LPCTSTR lpctstr = (LPCTSTR)Buffer;  // 直接强制类型转换
        printf("%s\n", Buffer);
        saveimage(lpctstr);

    }

    // 保持窗口显示
    //_getch();

    // 关闭图形窗口
    closegraph();
    return 0;
}

上述代码能够无限生成渐变的颜色。

测试的视频如下:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注