Мне нужно генерировать случайные цвета для всех пользователей в системе. Фокус в том, что 2 пользователя не могут иметь очень похожие цвета, их нужно отличить. У меня есть код для генерации случайных цветов, учитывая исходный цвет микса, но не могу найти способ генерировать случайные цвета с высокой контрастностью, используя только PHP
public static function generateRandomColor($rgb) { $red = rand(1, 256); $green = rand(1, 256); $blue = rand(1, 256); if (! empty($rgb)) { $red = ($red + $rgb['red']) / 2; $green = ($green + $rgb['green']) / 2; $blue = ($blue + $rgb['blue']) / 2; } $color = "rgb({$red}, {$green}, {$blue})"; return $color; }
и тогда у меня есть петля:
$colorsArr = array(); $mixed = array('red' => 255, 'green' => 255, 'blue' => 255); for($i = 0; $i < count($users); $i++) { $color = generateRandomColor($mixed); $colorsArr .= '<div style="width:25px; height: 25px; background-color: ' . $color . '"></div>'; }
теперь это создает цвета, но некоторые цвета выглядят как друг друга. Цель состоит в том, чтобы иметь уникальный цвет для каждого пользователя. любая благодарность благодарна.
ПРИМЕЧАНИЕ. Я не хочу жестко кодировать цвета для 500 пользователей.
Мне стало скучно, вот какой код вы можете пообщаться:
<?php define( COL_MIN_AVG, 64 ); define( COL_MAX_AVG, 192 ); define( COL_STEP, 16 ); // (192 - 64) / 16 = 8 // 8 ^ 3 = 512 colors function usercolor( $username ) { $range = COL_MAX_AVG - COL_MIN_AVG; $factor = $range / 256; $offset = COL_MIN_AVG; $base_hash = substr(md5($username), 0, 6); $b_R = hexdec(substr($base_hash,0,2)); $b_G = hexdec(substr($base_hash,2,2)); $b_B = hexdec(substr($base_hash,4,2)); $f_R = floor((floor($b_R * $factor) + $offset) / COL_STEP) * COL_STEP; $f_G = floor((floor($b_G * $factor) + $offset) / COL_STEP) * COL_STEP; $f_B = floor((floor($b_B * $factor) + $offset) / COL_STEP) * COL_STEP; return sprintf('#%02x%02x%02x', $f_R, $f_G, $f_B); } for( $i=0; $i<30; $i++ ) { printf('<div style="height: 100px; width: 100px; background-color: %s"> </div>'."\n", usercolor(rand())); }
Многие цвета будут выглядеть очень похожими, но шансы, что они будут рядом друг с другом, будут небольшими.