Я хочу изменить значения RGB в соответствии с процентом. означает, что 0% должен показывать красный цвет, 50% - зеленый и 100% - синий цвет. Я работаю над fastled. Я пробовал так, но не получил наилучшего результата.
int R,G,B;
int p = percentage;
if (p >= 0 and p <= 50){
R = abs(p - 100);
G = p*2;
}
if (p > 50 and p <= 100){
G = abs(p - 100);
B = p*2;
}
>! also tried
R = abs(p-100);
G = p/2;
B = p;
leds[0] = CRGB(R,G,B);
FastLED.show();
Вы пытаетесь добиться перехода от красного->зеленого->синего по мере того, как число идет от 0 до 100, чтобы создать эффект типа радуги, где цвет будет похож на местоположение на радуге? Например, желтый будет смесью красного и зеленого, то есть где-то около 25%.
Возможно, вы захотите рассмотреть возможность использования цветового пространства, отличного от RGB — HSV может быть лучшим вариантом.
да @дуг. Я хочу добиться перехода цвета, поскольку процентное соотношение варьируется от 0 до 100.
Быструю встроенную реализацию для преобразования HSV в RGB и обратно можно найти по адресу stackoverflow.com/a/14733008/2422450
Вам необходимо преобразовать процентные значения в 8-битные двоичные значения, т. е. преобразовать значения в диапазоне [0,100] в значения в диапазоне [0,255] (то есть [0x00,0xFF] в шестнадцатеричном формате).
Простая операция масштабирования делает это:
int r = pR * 255 / 100; // percentage red to hex
или эквивалентно:
int r = pR * 0xFF / 100; // percentage red to hex
Обратное преобразование из шестнадцатеричного значения в процентное — это просто обратная операция.
Обратите внимание, что, поскольку существует только 101 процентное значение, вы не получите все 256 возможных 8-битных шестнадцатеричных значений при выполнении этого преобразования, но оно должно быть достаточно близким.
Из вашего заявления о проблеме вы, вероятно, хотите что-то вроде этого, которое генерирует цвета RGB против часовой стрелки вокруг цветовой гаммы sRGB от красного до синего.
#include <array>
#include <string>
#include <cmath>
#include <iostream>
std::array<uint8_t, 3> getcolorpercent(double percent)
{
std::array<uint8_t, 3> rgb{};
int segment{static_cast<int>(percent/25)};
double percent_f = .01 * (percent - 25 * segment);
double col0{ 1 }, col1{ 1 };
if (segment % 2 == 0)
col1 = sqrt(4 * percent_f);
else
col0 = sqrt(1 - 4 * percent_f);
rgb[(segment / 2) % 3] = static_cast<uint8_t>(std::round(255*col0));
rgb[(1 + segment / 2) % 3] = static_cast<uint8_t>(std::round(255 * col1));
return rgb;
}
int main()
{
auto print = [](const std::array<uint8_t, 3> rgb, std::string descr) {
// note: 0+... is to convert uint8_t to int to precent interpreting as char
std::cout << descr << " red:" << 0+rgb[0] << " green:" << 0+rgb[1] << " blue:" << 0+rgb[2] << '\n';
};
std::array<uint8_t, 3> rgb_red = getcolorpercent(0);
std::array<uint8_t, 3> rgb_orange = getcolorpercent(15);
std::array<uint8_t, 3> rgb_yellow = getcolorpercent(25);
std::array<uint8_t, 3> rgb_cyan = getcolorpercent(75);
std::array<uint8_t, 3> rgb_violet = getcolorpercent(130);
print(rgb_red, "red = ");
print(rgb_orange, "orange = ");
print(rgb_yellow, "yellow = ");
print(rgb_cyan, "cyan = ");
print(rgb_violet, "violet = ");
}
Выход:
red= red:255 green:0 blue:0
orange= red:255 green:198 blue:0
yellow= red:255 green:255 blue:0
cyan= red:0 green:255 blue:255
violet= red:255 green:0 blue:228
Это создает (обратный) тип радуги от красного к синему для 0% до 100%. Кроме того, это было расширено, чтобы позволить процентам превышать 100, которые можно использовать для получения цветов от синего->фиолетового->фиолетового и обратно до красного. Вот изображение, созданное из этого перехода от 0 до 100 процентов:
как python и html относятся к вопросу? Пожалуйста, не используйте нерелевантные теги. Вы пробовали записывать некоторые тестовые значения? например каковы значения R, G и B, когда
p
равно 0, 25, 50, 75 и 100?