Предположим, у вас есть массив чисел с плавающей точкой (или строк или 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
Тогда красные оттенки могут линейно уменьшаться с 255 при 28,3 до 0 при 16,3, а зеленые оттенки могут линейно увеличиваться с 0 при 16,3 до 255 при 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]]]