2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
你的发光二极管颜色过渡在欺骗你
问题不在于你的代码,而在于你的颜色所处的色彩空间。
你花了三个小时调整颜色过渡效果。从黄色到紫罗兰色。你编写了代码,上传后,看着你的发光二极管灯带从黄色变为白色,再变为紫罗兰色。
等等——白色?
你并没有要求出现白色。但它就在那里,正好位于黄色和紫罗兰色的中间。它本不该出现在那里,但你似乎无法摆脱它。
这就是颜色过渡的谎言,而它内置于大多数发光二极管教程所教授的颜色混合方法中。
看起来正确但感觉错误的代码
\c
uint8_t red = map(timeNow, timeStart, timeEnd, startRed, endRed);
uint8_t green = map(timeNow, timeStart, timeEnd, startGreen, endGreen);
uint8_t blue = map(timeNow, timeStart, timeEnd, startBlue, endBlue);
return strip.Color(red, green, blue);
\\
这是红绿蓝线性插值。你通过独立地对每个通道进行线性插值,在红绿蓝空间中移动。
红绿蓝空间有一个没人告诉你的特性:白色是红绿蓝立方体的几何中心。
当你从黄色(红绿蓝:255, 255, 0)过渡到紫罗兰色(红绿蓝:128, 0, 255)时,这条线的中点是白色(红绿蓝:192, 128, 128)。你编写的代码并不是要经过白色,而是经过红绿蓝空间,而红绿蓝空间的中间有一个白色形状的“空洞”。
当你在颜色过渡中看到白色闪烁时,你的大脑看到的不是平滑的渐变,而是一种中断。白色是一种重置。它感觉不像是在从黄色移动到紫罗兰色,而更像是发光二极管在重置,然后继续。
不会撒谎的色彩空间
答案是使用色相、饱和度、明度空间,而不是红绿蓝空间。
色相、饱和度、明度(HSV)通过色轮上的位置来描述颜色,而不是通过通道混合。在色相、饱和度、明度空间中,从黄色到紫罗兰色只是绕色轮走一小段路——你不会经过白色,因为白色不是你行走路径上的一个位置,它是颜色的缺失。
\c
// 色相、饱和度、明度方法:绕色轮的最短路径
float startHue = map(timeNow, timeStart, timeEnd, startHue, endHue);
CHSV hsv;
hsv.hue = startHue;
hsv.saturation = 255;
hsv.value = 255;
return strip.ColorHSV(hsv);
\\
在色相、饱和度、明度空间中,从黄色到紫罗兰色:没有白色,没有重置。这是一种干净的光谱过渡,你的大脑将其解读为连续的运动。
代码更简短,结果感觉更有生命力。这就是导航红绿蓝空间与导航色彩空间之间的区别。
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。