C # Цветовые оттенки для разных значений - PullRequest
0 голосов
/ 06 марта 2011

Я хотел бы получить несколько советов о том, как сделать следующее в C #. Я хотел бы нарисовать «цвет», точный цвет будет определяться значением свойства, для примера давайте предположим, что это процент.

В идеале я бы хотел, чтобы пользователь указал пять цветов.

  Negative MAX
  Negative MIN
  Even
  Positive MIN
  Positive MAX

Пользователь указывает цвета только для каждого уровня, а не значение, определяющее минимальное и максимальное значения.

Используя эти данные, я бы хотел рассчитать цвет на основе процента. то есть 57% приведет к цветному оттенку между положительным минимальным и положительным максимальным. Любая помощь или совет для этого приветствуется.

Ответы [ 2 ]

0 голосов
/ 06 октября 2012

Используя скопированную функцию отсюда , вы можете преобразовать оттенки обратно в цвета RGB. Эта функция предполагает, что все входы и выходы представлены в масштабе 0..1, поэтому вам нужно разделить на color.GetHue () на 255. Ниже функции приведен пример кода с использованием набора процентов; внедрите DisplayColor в выбранный вами пользовательский интерфейс, чтобы увидеть результаты.

public static void HSVToRGB(double H, double S, double V, out double R, out double G, out double B)
{
    if (H == 1.0)
    {
        H = 0.0;
    }

    double step = 1.0/6.0;
    double vh = H/step;

    int i = (int) System.Math.Floor(vh);

    double f = vh - i;
    double p = V*(1.0 - S);
    double q = V*(1.0 - (S*f));
    double t = V*(1.0 - (S*(1.0 - f)));

    switch (i)
    {
        case 0:
            {
                R = V;
                G = t;
                B = p;
                break;
            }
        case 1:
            {
                R = q;
                G = V;
                B = p;
                break;
            }
        case 2:
            {
                R = p;
                G = V;
                B = t;
                break;
            }
        case 3:
            {
                R = p;
                G = q;
                B = V;
                break;
            }
        case 4:
            {
                R = t;
                G = p;
                B = V;
                break;
            }
        case 5:
            {
                R = V;
                G = p;
                B = q;
                break;
            }
        default: 
            {
                // not possible - if we get here it is an internal error
                throw new ArgumentException();
            }
    }
}

Color min = Color.Blue;
Color max = Color.Green;

float minHue = min.GetHue() / 255;
float maxHue = max.GetHue() / 255;

float scale = maxHue - minHue;

float[] percents = new float[] { .05F, .15F, .40F, .70F, .85F, .95F };

foreach (var pct in percents) {
    float curHue = minHue + (scale * pct);
    double r, g, b;
    HSVToRGB(curHue, 1.0, 1.0, out r, out g, out b);

    Color curColor = Color.FromArgb((int)(r * 255), (int)(g * 255), (int)(b * 255));
    DisplayColor(curColor);
}
0 голосов
/ 06 марта 2011

Для интерполяции между двумя цветами вы просто интерполируете каждый цветовой канал

Color color1 = Color.Red;
Color color2 = Color.Green;
double fraction = 0.3;
Color color3 = Color.FromArgb(
    (int)(color1.R * fraction + color2.R * (1 - fraction)),
    (int)(color1.G * fraction + color2.G * (1 - fraction)),
    (int)(color1.B * fraction + color2.B * (1 - fraction)));

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

...