在这篇文章中,我找到了一种确定 RGB 颜色亮度的算法:
亮度(某些色彩空间的标准):(0.2126*R + 0.7152*G + 0.0722*B)
我想使用这个等式,从 开始rgb(0,0,0)
,按照从最低到最高亮度的顺序生成所有 RGB 颜色,然后将它们绘制到 4096x4096 画布上。
我的问题是,对于 1670 万种不同的组合,我无法全部生成它们然后对它们进行排序,而不会导致浏览器崩溃或花费数天时间来完成渲染。所以我想找到一种方法来找到每个数字的倍数,这些数字将相加到下一个最小的数字。
例如,从 和 的 rgb 开始0,0,0
,亮度将为 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
. 然后 1 乘 1 计数到2,550,000
( 2126*255 + 7152*255 + 722*255
),我可以检查每个数字是否是方程的解2126r + 7152g + 722b = n
,其中 n 是当前计数的数字,而 r、g 和 b 是未知数。如果我能做到这一点,我可以计算出下一个连续亮度值处所有可能的 rgb 值,甚至不必将重复亮度值的任何值加倍,我只需要进行 255 万次计算而不是 16.77+ 百万次(每种颜色一个)。如果有人知道如何编写这个方程,或者如果有人有更好的解决方案,我将非常感激。谢谢!