алгоритм для преобразования целых чисел массива в значение RGB (аналог Excel) - PullRequest
0 голосов
/ 03 мая 2019

Учитывая массив положительных и отрицательных целых чисел ...

Я хотел бы вернуть зеленый или красный цвет градиента относительно его значения в массиве.

Подобно условному форматированию 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 Ответ

1 голос
/ 03 мая 2019

Предположим, у вас есть массив чисел с плавающей точкой (или строк или 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]]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...