Intereting Posts
Python Regex vs PHP Regex mysql_fetch_assoc, не может показаться, что проблема PHPUnit: методы stub undefined Как начать работу с Zend Framework developemt Автоматическое заполнение формы и автоматическое отправку с помощью параметров URL Проверка типа MIME бесполезна для загрузки файла? (в частности, используя API файлов Javascript)? Определение мобильного браузера PHP? как использовать JQuery AJAX в компонентах Joomla? PHP 5.5 password_ * функции повторного хеширования php5 преобразует 64-битное целое число в double – как сила 64-бит? PHP / Javascript: запоминание состояния полей формы и формы с помощью файлов cookie создать определенную папку для загрузки на основе роли пользователя и ограничить доступ к другой папке в laravel elfinder Получить строку запроса URL Алгоритмы для сходства строк (лучше, чем у Левенштейна и аналогичного текста)? Php, Js Как добавить свойство к объекту в PHP> = 5.3 строгий режим без генерации ошибки

Значение карты для цветовой шкалы

У меня есть список значений, которые должны быть нанесены на карту с определенным цветом. Закладка на карту уже выполнена, но мне нужно выяснить способ сопоставления значения n с цветом, который представляет его значение.

Пример и мое решение до сих пор – нормализовать значения на основе min и max а затем назначить их шестнадцатеричному цвету 0 для самого низкого и 255 для самого высокого. Это, конечно, ограничивает мое «я» серой шкалой. Вот код:

 $color = ($value / $max) * 255 // (min is zero) 

Но как это сделать, если значения должны идти от синего до красного, например? Есть ли общие библиотеки или инструменты, которые могут решить эту проблему? Пока я не смог найти никого.

Для этого могут быть libs. Однако давайте немного разойдемся с общими принципами. В общем, у вас есть следующие варианты:

  1. $coloridx=array(0=>'#FFFFFF',1=>'#FFEE00',...); индекс цвета, например $coloridx=array(0=>'#FFFFFF',1=>'#FFEE00',...);
  2. Любой алгоритм, например линейный градиент, который в основном представляет собой итерационную адаптацию всех трех каналов RGB (R = красный, G = зеленый, B = синий).
  3. Комбинация обоих, которая обычно выводит результат любого сложного алгоритма в индекс цвета, а затем идет оттуда.

Если вы включаете алгоритмы в свои соображения, вы должны понимать, что нет true или false . Все зависит от того, что вы хотели бы реализовать. Могут быть случаи, когда имеет смысл отображать изменения зеленого цвета на n=0..10 а затем красным до черного во всем, кроме n>10 . Шапки и мультипликаторы помогают устанавливать акценты. Такие вещи.

Одним из способов реализации линейного градиента было бы:

 function lineargradient($ra,$ga,$ba,$rz,$gz,$bz,$iterationnr) { $colorindex = array(); for($iterationc=1; $iterationc<=$iterationnr; $iterationc++) { $iterationdiff = $iterationnr-$iterationc; $colorindex[] = '#'. dechex(intval((($ra*$iterationc)+($rz*$iterationdiff))/$iterationnr)). dechex(intval((($ga*$iterationc)+($gz*$iterationdiff))/$iterationnr)). dechex(intval((($ba*$iterationc)+($bz*$iterationdiff))/$iterationnr)); } return $colorindex; } $colorindex = lineargradient( 100, 0, 0, // rgb of the start color 0, 255, 255, // rgb of the end color 256 // number of colors in your linear gradient ); $color = $colorindex[$value]; 

Я ОБНОВЛЯЛ код для добавления dechex, который возвращает комментарии.

Другой ответ был очень полезен. Я решил использовать JS, поскольку он снижает нагрузку на сервер. Требования также изменились. Бар должен перейти от красного к белому посередине, а затем от белого до желтого. И если значение равно 0, оно должно быть черным. Вот мой код для тех, кто когда-либо сталкивается с подобной ситуацией.

 var normalize_base = 2*255; var no_con_color = "black"; function decimalToHex(d, padding) { var hex = Number(d).toString(16); padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding; while (hex.length < padding) { hex = "0" + hex; } return hex; } function normalize(max, min, value) { var normalized = (value - min) / (max - min) ; return Math.floor(normalized * normalize_base); } function value2Color(value) { if(value <= 0 || value == undefined) { return no_con_color; } var g = 0; var b = 0; var r = 0; if(value < 255) { r = 255; g = value; b = value; } else { r = (2*255) - value; g = 255; b = (2*255) - value; } return "#" + decimalToHex(r) + decimalToHex(g) + decimalToHex(b); } 

Для этого есть I2UI .

 <div data-i2="color:['#404040','#00FF21']"> <span data-i2="rate:1">A</span> <span data-i2="rate:2">B</span> <span data-i2="rate:3">C</span> <span data-i2="rate:4">D</span> <span data-i2="rate:5">E</span> </div> 

Существует цветовой диапазон: от «Серый» – до «Зеленый». Элемент span, который имеет самое низкое значение скорости, получает цвет «Серый», элемент с наибольшей скоростью получает «зеленый» цвет.

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

Кроме того, вызовите JavaScript i2.emph () после загрузки предыдущего HTML.

См. Демонстрацию

Значения цветов представляют собой представления. Числовые цвета, а также шестнадцатеричные цвета. Цвет «без оттенков серого» содержит как минимум две различные информации: красное значение, зеленое значение или синие значения могут отличаться. Выполнение операции над ее представлением дает неправильный результат. Затем необходимо отобразить «Картирование» для каждой части информации. Вам нужно извлечь красные, зеленые и синие значения, выполнить сопоставление отдельно, а затем создать представление цвета результата. Вот быстрый помощник, который использует «минимальный цвет» »и« max color », выполняет сопоставление по красным, зеленым и синим значениям в соответствии с« n »значением, с которым вам нужно работать, а затем возвращать цвет результата в шестнадцатеричной строке. Он также работает для любых цветов или цветов серого цвета ,

 function linear_color($from, $to, $ratio) { // normalize ralio $ratio = $ratio<0?0:($ratio>1?1:$ratio); // unsure colors are numeric values if(!is_numeric($from))$from=hexdec($from); if(!is_numeric($to))$to=hexdec($to); $rf = 0xFF & ($from >> 0x10); $gf = 0xFF & ($from >> 0x8); $bf = 0xFF & $from; $rt = 0xFF & ($to >> 0x10); $gt = 0xFF & ($to >> 0x8); $bt = 0xFF & $to; return str_pad( dechex(($bf + (($bt-$bf)*$ratio)) + ($gf + (($gt-$gf)*$ratio) << 0x8) + ($rf + (($rt-$rf)*$ratio) << 0x10)), 6,'0',STR_PAD_LEFT); } 

Просто укажите 2 цвета как числовое значение или шестнадцатеричную строку (без hash!), Например:

 $color_from = hexdec('c2c2c2'); $color_to = hexdec('1eb02b'); for($i=-0.2; $i<=1.3; $i+=0.04){ echo '<div style="background-color: #'; echo linear_color($color_from, $color_to, $i); echo '">'; echo 'Result color when n = <strong>'.$i.'</strong>'; echo '</div>'; }