下面给出一个示例的 JavaScript 函数,针对常见节日(“春节、圣诞节、万圣节、复活节、排灯节、独立日、感恩节、五月五日节”)生成对应的 WS2812 幻彩灯珠颜色序列。该函数包含以下特点:
- 节日色彩主题:根据不同节日定义若干基础色。
- 颜色强度(亮度/饱和度因子):利用传入的
intensity
调整颜色的明亮程度。 - 随机性:每个灯珠基于节日的主题色,做一些随机偏移,让整体显示更灵动,而非静态单调。
注意:
- 这里“颜色强度”主要用来控制亮度(可能也可理解为饱和度/鲜艳度)。
- 可根据实际需求,扩展更多随机策略或者调整色彩范围。
- 颜色输出格式为
[[R,G,B], [R,G,B], ...]
,每个 R/G/B 范围在0~255
。
/**
* 生成 WS2812 幻彩灯珠颜色值序列
* @param {string} holiday - 节日类型,如 "春节", "圣诞节", "万圣节" 等
* @param {number} intensity - 颜色强度,范围 0~1
* @param {number} numLeds - 要生成的灯珠数量
* @returns {number[][]} 返回一个长度为 numLeds 的数组,每个元素是 [R, G, B]
*/
function generateHolidayColors(holiday, intensity, numLeds) {
// 针对每个节日定义一些基础色 (RGB),根据需求可自由增加或调整
const holidayPalettes = {
"春节": [
[255, 0, 0], // 大红
[255, 215, 0] // 金色 (近似:金黄)
],
"圣诞节": [
[255, 0, 0], // 红
[0, 128, 0], // 绿
[255, 255, 255] // 白
],
"万圣节": [
[255, 140, 0], // 橙 (南瓜色)
[128, 0, 128], // 紫
[0, 0, 0], // 黑 (灯珠上可用较暗紫或暗橙代替)
[0, 255, 0] // 也可加一点诡异的绿
],
"复活节": [
[255, 192, 203], // 浅粉
[173, 216, 230], // 浅蓝
[152, 251, 152], // 浅绿 (PaleGreen)
[221, 160, 221] // 浅紫 (Plum)
],
"排灯节": [
[255, 140, 0], // 橙
[255, 215, 0], // 金黄
[255, 20, 147] // 亮粉 (象征节日的绚丽)
],
"独立日": [
[255, 0, 0], // 红
[255, 255, 255], // 白
[0, 0, 255] // 蓝
],
"感恩节": [
[255, 165, 0], // 橙 (秋天的南瓜色)
[210, 105, 30], // 棕
[255, 215, 0] // 金黄
],
"五月五日节": [
[0, 128, 0], // 绿
[255, 0, 0], // 红
[255, 255, 255], // 白
[255, 255, 0] // 黄,鲜艳点
]
};
// 如果没有找到对应节日,则使用默认色(白色或其他)
let palette = holidayPalettes[holiday];
if (!palette) {
palette = [[255, 255, 255]]; // 默认全白
}
// 结果数组
let colors = [];
for (let i = 0; i < numLeds; i++) {
// 从该节日的色彩主题中随机挑一个基础色
let base = palette[Math.floor(Math.random() * palette.length)];
let [rBase, gBase, bBase] = base;
// 将基础色的亮度根据 intensity 进行缩放
// intensity=0 => 黑色, intensity=1 => 原色
// 下面是简单的线性缩放,也可根据需要添加伽马校正
let r = rBase * intensity;
let g = gBase * intensity;
let b = bBase * intensity;
// 在此基础上引入一些随机浮动,让灯珠颜色更活泼:
// 幅度可根据 intensity 调整, 避免过度偏离原色
// 例如随机范围 ±(30 * intensity),可根据需求微调
let variation = 30 * intensity;
r += (Math.random() - 0.5) * 2 * variation;
g += (Math.random() - 0.5) * 2 * variation;
b += (Math.random() - 0.5) * 2 * variation;
// 保持在 0-255 范围
r = Math.min(Math.max(0, r), 255);
g = Math.min(Math.max(0, g), 255);
b = Math.min(Math.max(0, b), 255);
// 存储到结果数组
colors.push([Math.round(r), Math.round(g), Math.round(b)]);
}
return colors;
}
// ========== 示例调用 ==========
// 春节,强度 0.8,100 颗灯
let resultSpringFestival = generateHolidayColors("春节", 0.8, 100);
console.log("春节:", resultSpringFestival);
// 圣诞节,强度 1.0,10 颗灯
let resultChristmas = generateHolidayColors("圣诞节", 1.0, 10);
console.log("圣诞节:", resultChristmas);
// 五月五日节,强度 0.5,10 颗灯
let resultCincoDeMayo = generateHolidayColors("五月五日节", 0.5, 10);
console.log("五月五日节:", resultCincoDeMayo);
说明
- 节日与色彩:
- 以上仅是示例色彩,每个节日通常会有更多可选的象征色,比如春节可再加一些喜庆的粉色或鞭炮金黄,复活节也可加更多五彩缤纷的 pastel(糖果色)等。可自行拓展。
- 亮度/强度缩放:
- 在示例中简单用了
rBase * intensity
进行线性缩放。如有需要可做伽马校正或者更复杂的曲线映射。
- 在示例中简单用了
- 随机浮动:
- 添加了
±30 * intensity
的随机变化,可根据视觉体验来调大或调小,使灯珠在同一节日主题下也呈现丰富变化。
- 添加了
- 超界限制:
- 调整颜色值时注意不要超出
[0,255]
范围。
- 调整颜色值时注意不要超出
- 拓展:
- 可以结合 HSV/HSL 空间做更多花样,比如色调小幅晃动、饱和度随随机数变化等,令色彩更具层次感。
如以上示例,即可在同一节日、相同参数下,每次得到略有不同的灯光效果,让整体灯光不再“静态单调”,而更显动感与多彩。