Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Условное форматирование -- процентное преобразование в цвет
Какой самый простой способ преобразовать процент в цвет от зеленого (100%) до Красного (0%), с желтым для 50%?
Я использую обычный 32-битный RGB-так что каждый компонент является целым числом от 0 до 255. Я делаю это в C#,, но я думаю, что для такой проблемы, как эта, язык действительно не имеет большого значения.
Основываясь на ответах Мариуса и Энди я использую следующее решение:
double red = (percent < 50) ? 255 : 256 - (percent - 50) * 5.12;
double green = (percent > 50) ? 255 : percent * 5.12;
var color = Color.FromArgb(255, (byte)red, (byte)green, 0);
Работает отлично - единственная поправка, которую я должен был сделать из решения Мариуса, была использовать 256, так как (255 - (процент - 50) * 5.12 выход -1, когда 100%, по какой-то причине приводит к желтому цвету в Silverlight (-1, 255, 0) -> желтый цвет ...
Я сделал эту функцию в JavaScript году. Он возвращает цвет строки css. Он принимает процент как переменную, с диапазоном от 0 до 100. Алгоритм может быть выполнен на любом языке:
function setColor(p){
var red = p<50 ? 255 : Math.round(256 - (p-50)*5.12);
var green = p>50 ? 255 : Math.round((p)*5.12);
return "rgb(" + red + "," + green + ",0)";
}
Что вы, вероятно, хотите сделать, это назначить 0% в 100% некоторые моменты в HSV или HSL цвет-пространство. Оттуда вы можете интерполировать цвета (а желтый просто оказывается между красным и зеленым :) и преобразовать их в RGB . Это даст вам красивый градиент между ними.
Предполагая, что вы будете использовать цвет в качестве индикатора состояния и с точки зрения пользовательского интерфейса, однако, это, вероятно, не такая хорошая идея, поскольку мы довольно плохо видим небольшие изменения в цвете. Таким образом, деление ценности на, например, три-семь ведер даст вам более заметные различия, когда вещи меняются, за счет некоторой точности (которую вы, скорее всего, не сможете оценить в любом случае).
Итак, если отбросить всю математику, в конце концов я бы рекомендовал a look-up-table со следующими цветами, где V-входное значение:
#e7241d for v <= 12%
#ef832c for v > 12% and v <= 36%
#fffd46 for v > 36% and v <= 60%
#9cfa40 for v > 60% and v <= 84%
#60f83d for v > 84%
Они были очень наивно преобразованы из значений HSL(0.0, 1.0, 1.0), (30.0, 1.0, 1.0), (60.0, 1.0, 1.0), (90.0, 1.0, 1.0), (120.0, 1.0, 1.0), и вы можете немного изменить цвета в соответствии с вашими целями (некоторым не нравится, что красный и зеленый не являются 'pure').
Пожалуйста смотрите:
- Использование цвета HSL (оттенок, насыщенность, яркость) для создания более привлекательного GUIs для некоторых обсуждений и
- RGB и HSL преобразования цветового пространства для образца исходного кода C#.
Это хорошее чистое решение, которое улучшает принятый в настоящее время ответ тремя способами:
- Удаляет магическое число (5.12), таким образом делая код более простым для выполнения.
- Не будет производить ошибку округления, которая дает вам -1, когда процент равен 100%.
- Позволяет настроить минимальное и максимальное значения RGB, которые вы используете, так что вы можете создать более светлый или темный диапазон, чем простой rgb(255, 0, 0) - rgb(0, 255, 0).
Показанный код-C#, но это тривиально, чтобы адаптировать алгоритм к любому другому языку.
private const int RGB_MAX = 255; // Reduce this for a darker range
private const int RGB_MIN = 0; // Increase this for a lighter range
private Color getColorFromPercentage(int percentage)
{
// Work out the percentage of red and green to use (i.e. a percentage
// of the range from RGB_MIN to RGB_MAX)
var redPercent = Math.Min(200 - (percentage * 2), 100) / 100f;
var greenPercent = Math.Min(percentage * 2, 100) / 100f;
// Now convert those percentages to actual RGB values in the range
// RGB_MIN - RGB_MAX
var red = RGB_MIN + ((RGB_MAX - RGB_MIN) * redPercent);
var green = RGB_MIN + ((RGB_MAX - RGB_MIN) * greenPercent);
return Color.FromArgb(red, green, RGB_MIN);
}
Записи
Вот простая таблица, показывающая некоторые процентные значения и соответствующие красные и зеленые пропорции, которые мы хотим получить:
VALUE GREEN RED RESULTING COLOUR
100% 100% 0% green
75% 100% 50% yellowy green
50% 100% 100% yellow
25% 50% 100% orange
0% 0% 100% red
Надеюсь, вы можете видеть это довольно ясно
- зеленое значение равно 2х процентному значению (но ограничено 100)
- красный цвет является обратным: 2x (100-процентный) (но ограничен на 100)
Поэтому мой алгоритм вычисляет значения из таблицы, которая выглядит примерно так...
VALUE GREEN RED
100% 200% 0%
75% 150% 50%
50% 100% 100%
25% 50% 150%
0% 0% 200%
...а затем использует Math.Min() , чтобы ограничить их до 100%.
Поскольку желтый-это смесь красного и зеленого, вы, вероятно, можете начать с #F00 , а затем скользить зеленым вверх, пока не нажмете #FF0 , а затем скользить красным вниз до #0F0 :
for (int i = 0; i < 100; i++) {
var red = i < 50
? 255
: 255 - (256.0 / 100 * ((i - 50) * 2));
var green = i < 50
? 256.0 / 100 * (i * 2)
: 255;
var col = Color.FromArgb((int) red, (int) green, 0);
}
Я написал эту функцию python на основе кода javascript. он принимает процент как десятичную дробь. кроме того, я увеличил значение квадрата, чтобы сохранить цвета более красными в течение более длительного времени по шкале процента. Я также сузил диапазон цветов с 255 до 180, чтобы дать более темный красный и зеленый на каждом конце. с ними можно играть, чтобы придать красивые цвета. Я бы хотел добавить немного апельсина в середину, но мне нужно заняться нормальной работой, бу.
def getBarColour(value):
red = int( (1 - (value*value) ) * 180 )
green = int( (value * value )* 180 )
red = "%02X" % red
green = "%02X" % green
return '#' + red + green +'00'
Мое решение для ActionScript 3:
var red:Number = (percentage <= 50) ? 255 : 256 - (percentage - 50) * 5.12;
var green:Number = (percentage >= 50) ? 255 : percentage * 5.12;
var redHex:Number = Math.round(red) * 0x10000;
var greenHex:Number = Math.round(green) * 0x100;
var colorToReturn:uint = redHex + greenHex;
Я использую следующие процедуры Python для смешивания цветов:
def blendRGBHex(hex1, hex2, fraction):
return RGBDecToHex(blendRGB(RGBHexToDec(hex1),
RGBHexToDec(hex2), fraction))
def blendRGB(dec1, dec2, fraction):
return [int(v1 + (v2-v1)*fraction)
for (v1, v2) in zip(dec1, dec2)]
def RGBHexToDec(hex):
return [int(hex[n:n+2],16) for n in range(0,len(hex),2)]
def RGBDecToHex(dec):
return "".join(["%02x"%d for d in dec])
Например:
>>> blendRGBHex("FF8080", "80FF80", 0.5)
"BFBF80"
Другая процедура обертывает это, чтобы хорошо смешаться между числовыми значениями для " условного форматирования":
def colourRange(minV, minC, avgV, avgC, maxV, maxC, v):
if v < minV: return minC
if v > maxV: return maxC
if v < avgV:
return blendRGBHex(minC, avgC, (v - minV)/(avgV-minV))
elif v > avgV:
return blendRGBHex(avgC, maxC, (v - avgV)/(maxV-avgV))
else:
return avgC
Итак, в случае с Джонасом:
>>> colourRange(0, "FF0000", 50, "FFFF00", 100, "00FF00", 25)
"FF7F00"
Поскольку это R-G-B, цвета переходят от целочисленных значений -1 (Белый) к -16777216 для черного. с красным зеленым и желтым где-то посередине этого. Желтый на самом деле -256, в то время как красный -65536 и зеленый -16744448. Так что желтый на самом деле не находится между красным и зеленым в обозначении RGB. Я знаю, что с точки зрения волновых полей зеленый цвет находится на одной стороне, а красный-на другой стороне спектра, но я никогда не видел такого типа обозначения, используемого в компьютерах, поскольку спектр не представляет все видимые цвета.