Решение
Этот код сгенерирует «индекс цвета» для каждого из ваших светодиодов.
Вход (data
) представляет собой список итогов из вашего источника данных:
# generate fake some data
# this should be coming from you
import random
data = [random.randint(500, 1000) for x in range(10)]
# compute the commutative sum of the entries
cumsum = [0,]
for i in range(len(data)):
cumsum.append(cumsum[i]+data[i])
cumsum.pop(0)
total = cumsum[-1]
# now we are ready to set the LEDs' color index
led_count = 24
leds = [0] * led_count
item = 0
for i in range(len(leds)):
while (i+1)/led_count > cumsum[item]/total:
item += 1
leds[i] = item
Например, если ваши итоги (в data
) равны
[938, 765, 611, 980, 807, 961, 564, 919, 548, 888 ]
Тогда результаты в leds
будут
[0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 4 , 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9]
Значение светодиодов должно быть установлено на цвет 0 , что бы это ни было, затем следующие три до цвета 1 , и т. Д. c.
Как это работает?
Вместо того, чтобы пытаться выяснить сколько светодиодов нам нужно для каждой категории, код определяет, какую категорию назначить каждому светодиоду. Это гарантирует, что у нас будет не больше, не меньше, чем количество светодиодов, которые у нас есть на самом деле.
Код использует совокупную сумму , чтобы отслеживать, где изменение должно произойти из одной категории. к следующему.
Например, вместо того, чтобы сказать, у нас есть 10%, 20%, 60%, 10% каждой категории, мы рассматриваем текущий счет: 10%, 30%, 90%, 100%.
Каждый светодиод представляет 1/24% (для 24 светодиодов). При переходе через светодиоды (1/24%, 2/24%, 3/24%, 4/24%, ...) код проверяет, перешли ли мы порог от одной категории к другой, и сделали ли мы , увеличивает категорию, назначенную текущему индикатору.
Возможно, процент к категории настолько низок, что он будет полностью пропущен, но алгоритм даст вам максимально хорошее распределение.
Бонусные баллы
Поскольку в конечном итоге у вас будут значения RGB, есть возможность иметь «частичные» светодиоды.
Для этого вам необходимо отслеживать, где в Интервал между светодиодами является именно границей категории, и соответственно смешайте цвета.
Это не включено в код.