Вот кое-что для начала:
Вы можете получить значения r, g, b с помощью:
$color1 = 0xfff000;
$r1 = ($color1 >> 16) & 0xff;
$g1 = ($color1 >> 8) & 0xff;
$b1 = $color1 & 0xff;
Для интерполяции между двумя значениями:
define('MIN', 0.10);
define('MAX', 1.00);
define('RANGE', MAX - MIN);
$i = 0.10; // importance
$i = ($i - MIN) / RANGE;
$r = $r1 + ($r2 - $r1) * $i;
$g = $g1 + ($g2 - $g1) * $i;
$b = $b1 + ($b2 - $b1) * $i;
Тогда вы можете положить их обратно:
$color = ($r << 16) | ($g << 8) | $b;
Но RGB не обязательно является лучшим цветовым пространством для работы. Вы можете получить лучшие результаты, используя что-то вроде HSL.
В качестве альтернативы всему этому вы можете просто создать вручную 10 цветов и поместить их в массив:
$colors = array('#000000', '#100000', ... );
$color = $colors[intval(($importance - 0.10) / 0.0901)];
Число 0.0901 - это просто (MAX - MIN) / 10 + smallDelta
. Дельта используется для поддержания максимального индекса на уровне 9 (вместо 10), когда $importance == MAX
.