Выбор цветов на основе IP-адреса - PullRequest
1 голос
/ 11 января 2012

В моем скрипте PHP (v5.2.17) я хочу выбрать уникальный цвет для записей текущего пользователя, основываясь на его IP-адресе.Я не хочу отображать значения цвета из шестнадцатеричных кодов, потому что я также хочу постепенно менять цвета каждой записи.Цвет всегда должен иметь одно из значений RGB, равное нулю (это похоже на набор ярких, основных цветов).

Есть ли для этого умное математическое решение?

Я бы хотелЯ очень признателен, если кто-нибудь из читателей этой статьи поделится своими мыслями.: -)

Ответы [ 3 ]

2 голосов
/ 11 января 2012

Вы действительно ограничиваете себя только шестью "базовыми" цветами?

255 255 0
255 0 255
0 255 255

0 0 255
0 255 0
255 0 0

Полагаю, вы собираетесь применить к этим цветам линейную функцию, чтобы попытаться их затухать. Это не обязательно будет выглядеть так же хорошо, как вы думаете - RGB как представление не очень линейно. Вы можете дешево приблизить лучшее "линейное" представление, используя вместо этого представление HSV или HSL . Они, конечно, не идеальны, но это будет немного более естественным, чем RGB.

Что касается сопоставления IP-адреса с цветом, вы можете сохранить эти цветовые комбинации в массиве и выбрать среди шести элементов, используя простую хеш-функцию . Что-то вроде этого может быть достаточно:

b1, b2, b3, b4 = <split the four bytes from an IP address>
index = (b1 * 17 + (b2 * 17 + (b3 * 17 + b4))) % 6

(Я только что выбрал множитель 17 из эфира - его двоичное представление - 10001, что означает, что биты каждого байта в адресе «размазаны» друг над другом. Могут быть и лучшие значения. После того, как вы выбрали несколько цветов и несколько IP-адресов, вы можете попробовать изменить множитель, например, 21 или 53 и посмотреть, что имеет смысл.)

1 голос
/ 11 января 2012

Хотя это не даст вам результата, когда один из {R,G,B} всегда равен 0, представление HSL может выглядеть хорошо.Например, пусть hue будет десятичным значением от 0 до 1, определяемым как

(float)(octet[0] + octet[1] << 8 + octet[2] << 16 + octet[3] << 24) / (2^32-1)

, где каждый octet[i] - это байт без знака, а ^ - это возведение в степень).А затем, возможно, установите легкость и насыщенность вручную, в соответствии с вашими предпочтениями.Просто идея!

В качестве дополнительного бонуса это облегчает выцветание цветов (просто вычтите часть времени из насыщенности / яркости).

0 голосов
/ 11 января 2012

вы используете базу данных для хранения отношений? Вы всегда можете получить IP-адрес пользователя

<?php
    function userIP(){
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $userIp=$_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $userIp=$_SERVER['REMOTE_ADDR'];
        }
        return trim($userIp);
    }
?>

Затем используйте функцию для установки полезной переменной IP:

<?php
    $Users_IP_address = userIP();
?> 

как только вы это сделаете, вы можете назначить цвет, который не используется, и сохранить связь для дальнейшего использования.

...