我正在使用Arduino和FastLED库控制一条LED,并且设置了一些功能,允许我更改LED等的颜色。
我有一个函数,其中传入红色、绿色和蓝色的值,并将整个条带设置为该颜色:
void changeColour(int valR, int valG, int valB) {
for (int i = 0; i < NUM_LEDS; i++) {
led[i] = CRGB(valR, valG, valB);
}
FastLED.setBrightness(255);
FastLED.show();
}
然后,我设置了一个预设颜色及其相应 RGB 值的二维数组:
int colours [20][3] = {
{255, 105, 180}, //HotPink
{255, 20, 147}, //DeepPink
{139, 0, 0}, //DarkRed
{255, 0, 0}, //Red
{255, 69, 0}, //OrangeRed
{255, 255, 0}, //Yellow
{128, 0, 0}, //Maroon
{50, 205, 50}, //LimeGreen
{0, 255, 0}, //Lime
{34, 139, 32}, //ForestGreen
{0, 128, 0}, //Green
{0, 100, 0}, //DarkGreen
{102, 205, 170}, //MediumAquaMarine
{0, 255, 255}, //Aqua
{0, 139, 139}, //DarkCyan
{0, 191, 255}, //DeepSkyBlue
{0, 0, 255}, //Blue
{128, 0, 128} //Purple
};
我想做的是调用changeColour();
函数并从数组中传入随机颜色的 RGB 值,所以我编写了该函数:
int randomColour(); {
int x = rand() % 18;
int valR = colours[x][0];
int valG = colours[x][1];
int valB = colours[x][2];
return (valR, valG, valB);
}
我将如何获取它,以便我可以调用changeColour()
函数,而不是changeColour(valR, valG, valB)
它调用randomColour()
函数,该函数反过来返回valR, valG
和valB
值,从而将它们传递到changeColour()
函数中?
你的第一个问题是randomColour
返回一个int
,只有一个而不是3。
(valR, valG, valB)
,这使用逗号运算符,该运算符按顺序计算所有操作数(在本例中为 nop(,整个表达式计算到最后一个操作数,即valbB
这就是您要返回的内容。
最简单和最合适的是为RGB颜色创建一个结构:
struct Rgb
{
int r;
int g;
int b;
};
void changeColour(Rgb color) {
for (int i = 0; i < NUM_LEDS; i++) {
led[i] = CRGB(color.r, color.g, color.b);
}
FastLED.setBrightness(255);
FastLED.show();
}
Rgb colours [20] = { /* ... */ };
Rgb randomColour() {
int x = rand() % 18;
return colours[x];
}
你想要的功能就是这样简单:
void changeToRandomColor()
{
changeColour(randomColour());
}
我还必须指出Arduino lib有自己的随机函数:https://www.arduino.cc/reference/en/language/functions/random-numbers/random/,我建议你考虑一下。
C++11 及更多都有可以使用的元组,但您还有其他选项可以执行此操作。
1 :您可以返回一个包含 r g b 值的结构,并从 randomColor(( 返回它。
2:更改 randomColor(( 以接受输出参数。
void randomColor(int &r, int &g, int &b) {
int x = rand() % 18;
r = colours[x][0];
g = colours[x][1];
b = colours[x][2];
}
void changeColor() {
int r, g, b;
randomColor(r, g, b);
std::cout << r << " " << g << " " << b << std::endl;
}
3:颜色的最大值为255。因此,您可以简单地使用 4 字节整数来填充打包三个值并使用位操作将它们解压缩。 像这样的东西。
unsigned int randomColor() {
unsigned int r = 11;
unsigned int g = 22;
unsigned int b = 33;
return r << 16 | g << 8 | b;
}
void change_color() {
unsigned int rgb = randomColor();
unsigned int b = rgb & 0xFF;
unsigned int g = (rgb >> 8) & 0xFF;
unsigned int r = (rgb >> 16) & 0xFF;
}
返回结构是最简单、最干净的解决方案。
您不能从 C++ 中的函数返回多个值(那么容易(。您的randomColour
函数实际上只返回一个值,valB
,因为它是表达式(valR, valG, valB)
中的最后一个值。
执行您要求的操作的一种简单方法是让randomColour
指针返回到colours
数组中,然后重载或更改changeColour
以接受int
数组。因此,与其在该函数内部使用valR
、valG
、valB
,不如使用colorReference[0]
、colorReference[1]
等。