将数组整数转换为RGB值的算法(类似于excel)

时间:2019-05-03 14:37:38

标签: ruby

给出正负整数数组...

我想返回相对于数组中其值的绿色或红色渐变颜色。

类似于excel条件格式,绿色越接近最大值,就应该越深。如果它们更接近最小值,则重量更轻。

类似于以下图像: foo

当前我正在这样做

if value == Float::INFINITY
  "rgba(0,255,0,1)"
elsif value > 0
  "rgba(0,255,0, #{Rational(value, maximum).to_f.round(2)})"
else
  "rgba(255,0,0,#{Rational(value, minimum).to_f.abs.round(2)})"
end

1 个答案:

答案 0 :(得分:1)

假设您有一个浮点数组(或转换为浮点的字符串或BigDecimal s):

arr = [
  [25.1, 13.5, 4.3],
  [28.3, 11.6, 5.9],
  [16.5, 17.3, 6.4]
]

这些数字如何转换为红色和绿色阴影当然是任意的,但这是一种可能性。假设我们计算:

mn, mx = arr.flatten.minmax
  #=> [4.3, 28.3] 
av = (mn+mx).fdiv(2)
  #=> 16.3 

然后,红色调可以从28.3的255线性减少到16.3的0,绿色可以从16.3的0到4.3的线性增加:

def rg_gradient(arr)
  mn, mx = arr.flatten.minmax
  av = (mn+mx).fdiv(2)
  above = mx-av
  below = av-mn
  arr.map do |a|
    a.map { |n| n > av ? [(255*(n-av)/above).round, 0] :
      [0, (255*(1-(av-n)/below)).round] }
  end
end

rg_gradient(arr)
  #=> [[[187, 0], [ 0, 195], [0,  0]],
  #    [[255, 0], [ 0, 155], [0, 34]],
  #    [[  4, 0], [21,   0], [0, 45]]]