Как плавно переходить между цветами в python?

#python #interpolation #raspberry-pi3 #rgb #lighting

#python #интерполяция #raspberry-pi3 #rgb #Освещение

Вопрос:

Я постоянно сохраняю выходные данные в файле CSV. Я могу прочитать эти данные и вызвать изменение освещения с помощью приведенного ниже кода. Переход в освещении происходит внезапно, но в идеале я хотел бы попытаться плавно перейти от одного цвета к другому нелинейным способом, используя только RPi3 и neopixels / ws2812b.

 df = pd.read_csv("output.csv")
second_last = df['modes'].iloc[-2]
last = df['modes'].iloc[-1]

if second_last == last and last == "one" :
    pixels.fill((255,0,0))
if second_last == last and last == "two" :
    pixels.fill((0,255,0))
if second_last == last and last == "three" :
    pixels.fill((0,0,255))
  

Я обнаружил, что для этого может использоваться функция smoothstep, но не уверен, как ее практически использовать.

Как можно заставить значения RGB следовать кривой, где начальный цвет равен 0, а цвет, в который он переходит, равен 1, если, например, используется следующая функция? Является ли это жизнеспособным подходом?

 y = 0.5 * (1   sin((x*pi)-(pi/2)))
  

Ответ №1:

Отказ от ответственности: Я специалист по изображениям / видео и я не использовал Raspberry Pi для освещения. Я предполагаю, что прямо сейчас ваше освещение меняется со всего красного на все зеленое и все синее, очень внезапно. Я описываю способ сделать это изменение более постепенным, но это, вероятно, неэффективно, и может быть более простой способ, специфичный для платформы.

Вам нужно определить время (скажем, t) для перехода. Кроме того, вы должны понимать, что цвет задается с помощью pixels.fill((255,0,0)). Эти три значения (255,0,0) представляют (R, G, B) *. Если вам нужны промежуточные цвета, у вас должна быть их комбинация. Итак, например, если вы хотите перейти от красного к синему, вам нужна последовательность из них с некоторыми промежуточными значениями. Линейно это может выглядеть примерно так:

 max=255
step = 255//t
for i in range(0,t):
  red = 255 - (t*step)
  green = 0
  blue = 255 - red
  RGBtriplet = (red, green, blue)
  

Затем нужно передать RGBtriplet в pixels.fill(). В качестве альтернативы вы могли бы использовать свою функцию:

    blue = 255 * (0.5 * (1   sin((t*pi)-(pi/2))))
   green = 0
   red = 255 - blue
  

Это должно дать вам нелинейный переход цвета, где синий переходит от 0 к 255, а красный — от 255 к 0 (красный к синему).

* Или, возможно (B, G, R).