我知道标题听起来令人困惑,所以我将在这里解释我想要实现的目标:
编辑:代码示例,应该加起来为 24 但不
我有 10 个数据源,它们加起来就是我的第 11 个数据源。
我想在 24 RGB 环上显示此数据,因此我将每个数据源转换为总数的百分比。
但是,如果我现在尝试通过将每个百分比乘以 24(例如 0.56x24、0.14x24 等)在我的 LED 环上显示它,我并不总是使用所有 LED,有时由于向上或向下舍入而超过或低于。
所以我的问题是,是否有一个功能可以将数据均匀完整地分布在24个LED上?
我希望这能解释我想要实现的目标,但请询问您是否需要更多信息。
谢谢
该代码将为每个 LED 生成“颜色索引”。
输入 ( 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
Run Code Online (Sandbox Code Playgroud)
例如,如果您的总计(在 中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]
这意味着第一个 LED 应设置为颜色 0,无论是什么,然后接下来的三个 LED 设置为颜色 1,依此类推。
该代码不是试图计算出每个类别需要多少个 LED,而是计算出为每个 LED 分配什么类别。这保证了我们所拥有的 LED 数量不会多于或少于我们实际拥有的 LED 数量。
该代码使用累积和来跟踪从一个类别到下一类别需要发生更改的位置。
例如,我们不是说每个类别有 10%、20%、60%、10%,而是考虑一个连续统计:10%、30%、90%、100%。
每个 LED 代表 1/24%(对于 24 个 LED)。当穿过 LED(1/24%、2/24%、3/24%、4/24%...)时,代码会检查我们是否跨过从一个类别到下一个类别的阈值,以及是否跨过阈值,增加分配给当前 LED 的类别。
某个类别的百分比可能非常低,以至于会被完全跳过,但该算法将为您提供尽可能好的分布。
由于最终您将获得 RGB 值,因此可以选择使用“部分”LED。
为此,您需要跟踪 LED 间隔中的哪个位置恰好是类别边界,并相应地混合颜色。
这不包含在代码中。