【发布时间】:2017-05-30 20:11:29
【问题描述】:
在this post 上,我找到了一种算法来确定 RGB 颜色的亮度:
亮度(某些色彩空间的标准):(0.2126*R + 0.7152*G + 0.0722*B)
我想使用这个等式,从 rgb(0,0,0) 开始,按照从最低到最高亮度的顺序生成所有 RGB 颜色,然后将它们绘制到 4096x4096 画布上。
我的问题是,对于 1670 万种不同的组合,我无法全部生成它们然后对它们进行排序,而不会导致浏览器崩溃或花费数天时间来完成渲染。所以我想找到一种方法来找到每个数字的倍数,这些数字总和是下一个最小的数字。
例如,从0,0,0 的 rgb 开始,亮度将为 0 (0.2126*0 + 0.7152*0 + 0.0722*0 = 0),下一个最小发光 rgb 值将是0,0,1,因为0.2126*0 + 0.7152*0 + 0.0722*1 = .0722,并且没有一组倍数可以求和为一个较小的数。
前 19 个连续的亮度值如下(我可能错过了一两个,因为我手动计算了它们,但希望它有助于说明这一点):
RGB => Luminence
0,0,0 => 0
0,0,1 => .0722
0,0,2 => .1444
1,0,0 => .2126
0,0,3 => .2166
1,0,1 => .2848
0,0,4 => .2888
1,0,2 => .357
0,0,5 => .361
2,0,0 => .4252
1,0,3 => .4292
0,0,6 => .4332
2,0,1 => .4974
1,0,4 => .5014
0,0,7 => .5054
2,0,2 => .5696
1,0,5 => .5736
0,0,8 => .5776
3,0,0 => .6378
我似乎找不到任何模式,所以我希望也许有一个方程式或编码技巧可以让我找到三个数字的倍数的最小和,高于前一个总和,无需暴力破解并检查每个可能的值。
编辑:我做了一些额外的研究,看起来解决方案可能在于使用线性丢番图方程。如果我取每个小数并乘以 1000,得到2126, 7152, & 722。然后逐一计数到2,550,000 (2126*255 + 7152*255 + 722*255),我可以检查每个数字是否是方程2126r + 7152g + 722b = n 的解,其中 n 是当前计数到的数字,r, g, & b 是未知数。如果我能做到这一点,我可以计算出下一个连续亮度值处所有可能的 rgb 值,甚至不必将重复亮度值的任何值加倍,我只需要进行 255 万次计算而不是 16.77+ 百万次(每种颜色一个)。如果有人知道如何编写这个方程式,或者如果有人有更好的解决方案,我将非常感激。谢谢!
【问题讨论】:
标签: javascript algorithm rgb luminance diophantine