如何平稳地在FULL RGB光谱中循环

时间:2019-05-15 15:15:12

标签: c++ arduino arduino-uno

我正在尝试平滑地遍历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值的平稳周期,那有可能吗?

1 个答案:

答案 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个元素似乎很不礼貌。