Создание цветового градиента

Я хочу показать своему пользователю, сколько (в процентах) их форм соответствуют новому стандарту. Я хочу, чтобы они визуально знали, что процентная сумма будет окрашена. Это будет 0xFF0000 (чисто красный) для 0% и 0x00FF00 (чисто зеленый) для 100%. Как лучше всего рассчитать цвет для каждого шага на этом пути?


person Malfist    schedule 08.06.2010    source источник
comment
stackoverflow.com/questions/668263/   -  person Pete Kirkham    schedule 08.06.2010
comment
Предположительно, новый стандарт не имеет ничего общего с доступностью, поскольку некоторые из ваших пользователей не смогут отличить красный цвет от зеленого.   -  person Pete Kirkham    schedule 08.06.2010
comment
Да, зеленый ‹-› красный будет сложным для людей с цветовой слепотой.   -  person Phil Gan    schedule 08.06.2010
comment
Нет, это просто то, сколько пользователей имеют электронные письма в своей форме. Красный ‹-› Зеленый не нужен, дальтоники все равно смогут увидеть номер.   -  person Malfist    schedule 08.06.2010


Ответы (2)


Преобразование цветового пространства (предложенное Tony) даст вам наилучшие результаты. Однако, если это выходит за рамки того, что вы ищете, я предлагаю простой алгоритм, который дает вам желтый цвет (0xFFFF00) на 50%:

Для значений до 50 % Начните с 0xFF0000.
Добавьте 0xFF * Percentage / 50 к зеленому компоненту.

Для значений выше 50 % Начните с 0xFFFF00.
Вычтите 0xFF * Percentage / 50 из красного компонента.

Результаты выглядят достаточно хорошо для моих клиентов ;-)

person Treb    schedule 08.06.2010

Вам не нужно вычислять его самостоятельно — попробуйте использовать LinearGradient кисть. (msdn)

LinearGradientBrush linGrBrush = new LinearGradientBrush(
   new Point(0, 10),
   new Point(200, 10),
   Color.FromArgb(255, 255, 0, 0),   // Opaque red
   Color.FromArgb(255, 0, 0, 255));  // Opaque blue

Pen pen = new Pen(linGrBrush);

e.Graphics.DrawLine(pen, 0, 10, 200, 10);
e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100);
e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30);
person Phil Gan    schedule 08.06.2010