让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;
}
上述代码能够无限生成渐变的颜色。
测试的视频如下: