我正在尝试平滑地遍历RGB光谱,但是到目前为止,我只能使代码平滑地通过768种颜色(256 * 3)或通过16777216种颜色(256 ^ 3)离散跳跃。
这是运行平稳的代码:
void loop() {
setColor(255,0,0);
setColor(255,255,0);
setColor(0,255,0);
setColor(0,255,255);
setColor(0,0,255);
setColor(255,0,255);
}
void setColor(int red, int green, int blue) {
while ( r != red ) {
if ( r < red ) r += 1;
if ( r > red ) r -= 1;
_setColor();
delay(10);
}
while ( g != green){
if ( g < green ) g += 1;
if ( g > green ) g -= 1;
_setColor();
delay(10);
}
while ( b != blue){
if ( b < blue ) b += 1;
if ( b > blue ) b -= 1;
_setColor();
delay(10);
}
}
void _setColor() {
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
}
以下是贯穿每个RGB值的代码:
void loop() {
for (r = 0; r <= 255; r++) {
for (g = 0; g <= 255; g++) {
for (b = 0; b <= 255; ++) {
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
}
}
}
平滑代码将永远不会在颜色的最大/最小值之间合并值,即我永远不会得到像[128,64,72]之类的东西,只输出像[255,64,0]或[0,0, 72]。
离散代码遍历每个蓝色值,然后增加绿色值,然后从0开始返回蓝色,即[0,0,254]-> [0,0,255]-> [0,1,0]-> [0,1,1]会产生离散的跳跃。
我试图获得一个遍历每个可能的RGB值的平稳周期,那有可能吗?
答案 0 :(得分:0)
确保您可以连续访问256 ^ 3空间中的每个点。
最简单的方法是从一条线开始,然后将一条线变成一个平面,然后再将一个平面变成一个立方体。
struct simple_generator {
int current = 0;
int min = 0;
int max = 255;
int direction = 1;
bool advance() // returns false iff we hit the end
{
if (current + direction > max || current+direction < min) {
direction = -direction;
return false;
}
current += direction;
return true;
}
};
现在让我们从中生成一个发电机。
template<std::size_t N>
struct shape_generator {
simple_generator state[N];
int operator[](std::size_t i) const { return state[i].current; }
bool advance() {
for (std::size_t i = 0; i < N; ++i) {
if (state[i].advance())
return true;
}
return false;
}
};
现在,它将使第一个简单的生成器前进,直到它溢出(这将导致生成器停滞并反转方向)。如果溢出,它将“递归”推进下一个。
如果每个生成器都溢出,则返回false。否则返回true。
这将产生一个非常无聊的曲线,因为它看起来像是“蓝色从顶部到顶部,然后从顶部向下,然后从顶部到顶部,然后向下”。只有经过多个循环后,才会显示绿色。而且只有在经过多次绿色循环之后,才会出现红色。
更出色的人会使用真实的空间填充曲线(例如希尔伯特曲线)的近似值。但这应该可行
Live example with a max of 5,因为运行256 ^ 3个元素似乎很不礼貌。