我的单元格的数值可以是 0 到 0 之间的任何值Integer.MAX_VALUE
。我想对这些单元格进行相应的颜色编码。
如果该值 = 0,则 r = 0。如果该值是Integer.MAX_VALUE
,则 r = 255。但是中间的值呢?
我想我需要一个函数,其极限为 x =>Integer.MAX_VALUE
是255。这个函数是什么?或者有更好的方法来做到这一点吗?
我可以这样做(value / (Integer.MAX_VALUE / 255))
但这会导致许多低值为零。所以也许我应该用日志函数来做到这一点。
我的大部分值都在 [0, 10,000] 范围内。所以我想强调其中的差异。
“最公平”的线性缩放实际上是这样完成的:
floor(256 * value / (Integer.MAX_VALUE + 1))
请注意,这只是伪代码并假设浮点计算。
如果我们假设 Integer.MAX_VALUE + 1 是 2^31,并且 / 会给我们整数除法,那么它简化为
value / 8388608
为什么其他答案都是错误的
一些答案(以及问题本身)提出了以下变化(255 * value / Integer.MAX_VALUE)
。大概这必须转换为整数,或者使用round()
or floor()
.
如果使用floor()
, 唯一的value
产生 255 的是 Integer.MAX_VALUE 本身。这种分布是不均匀的。
如果使用round()
、0 和 255 的命中次数分别是 1-254 的一半。也参差不齐。
使用我上面提到的缩放方法,不会出现这样的问题。
非线性方法
如果您想使用日志,请尝试以下操作:
255 * log(value + 1) / log(Integer.MAX_VALUE + 1)
您也可以只取该值的平方根(这不会一直到 255,但如果您愿意,可以将其放大)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)