2010-10-04 2 views
0

Я пытаюсь создать облако тегов и нуждаюсь в помощи в создании функции, которая может рассчитать цвет, необходимый для применения к каждой ссылке тега.PHP - рассчитать цвет (hex) на основе заданных переменных

У меня есть 3 переменные:

  • индивидуальный тег значение (от 0,1 до 1)
  • самый большой (самый важный) тег цвета (шестнадцатеричный код, например, 'fff000.)
  • (шестнадцатеричный код) маленький (менее важно) тег цвета (шестнадцатеричный код)
+1

Вы хотите интерполировать между двумя цветами с учетом важности тега? – Matthew

+0

да, точно. например. тег с значением = 0,5, наибольший_color = # 333 и smallest_color = # 555 будет иметь цвет # 444. – Alex

ответ

3

Вот некоторые вещи, чтобы вы начали:

вы можете получить г, 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.

+0

спасибо, но я получаю возвращаемое число от 1 до 3 цифр. Я думаю, это из-за 0xff. – Alex

+1

Вы можете использовать '$ html_color = sprintf (" #% 06x ", $ color);' для преобразования из целого числа 0xff0000 в строку цвета HTML. – Matthew

+0

tx, который работает, но я получаю неправильные цвета. Я думаю, это потому, что мне нужно преобразовать $ color1 и $ color2 из формата html в формат 0xff – Alex

Смежные вопросы