Как отобразить числовые значения для цветов в радуге в C#

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

Следующий метод MapRainbowColor отображает значение между двумя границами цвета радуги. Например, вам может понадобиться, чтобы 0 представлялось красным, а 100 - синим. В этом случае границы будут равны 0 и 100.

// Сопоставьте значение с цветом радуги.
private Color MapRainbowColor(
    float value, float red_value, float blue_value)
{
    // Преобразуем в значение от 0 до 1023.
    int int_value = (int)(1023 * (value - red_value) /
        (blue_value - red_value));

    // Отображение разных цветовых диапазонов.
    if (int_value < 256)
    {
        // От красного до желтого. (255, 0, 0) - (255, 255, 0).
        return Color.FromArgb(255, int_value, 0);
    }
    else if (int_value < 512)
    {
        // Желтый до зеленого. (255, 255, 0) - (0, 255, 0).
        int_value -= 256;
        return Color.FromArgb(255 - int_value, 255, 0);
    }
    else if (int_value < 768)
    {
        // Зеленый цвет. (0, 255, 0) - (0, 255, 255).
        int_value -= 512;
        return Color.FromArgb(0, 255, int_value);
    }
    else
    {
        // Аква к синему. (0, 255, 255) - (0, 0, 255).
        int_value -= 768;
        return Color.FromArgb(0, 255 - int_value, 255);
    }
}

Код сначала преобразует значение в целое число от 0 до 1023. Затем он определяет часть радуги, которая должна удерживать цвет, вычитает соответствующую сумму из целочисленного значения, чтобы поместить ее в правильный диапазон, и вычисляет соответствующий цвет в пределах диапазона.

Следующий обработчик события Paint использует метод MapRainbowColor, чтобы заполнить форму двумя радугами.

// Рисуем радужные цвета на форме.
private void Form1_Paint(object sender, PaintEventArgs e)
{
    int wid = this.ClientSize.Width;
    int hgt = this.ClientSize.Height;
    int hgt2 = (int)(hgt / 2);
    for (int x = 0; x < wid; x++)
    {
        using (Pen the_pen = new Pen(MapRainbowColor(x, 0, wid)))
        {
            e.Graphics.DrawLine(the_pen, x, 0, x, hgt2);
        }
        using (Pen the_pen = new Pen(MapRainbowColor(x, wid, 0)))
        {
            e.Graphics.DrawLine(the_pen, x, hgt2, x, hgt);
        }
    }
}

Этот код получает размеры формы wid и hgt, а затем циклически меняет ширину формы по одному пикселю за раз. Для каждого пикселя код отображает координату X пикселя в диапазоне от 0 до wid. Он рисует вертикальный сегмент линии в верхней половине формы, используя возвращенный цвет. Результатом является радуга, которая оттеняет от красного до синего.

Затем код снова отображает координату X пикселя, на этот раз переключая роли красных и синих граничных значений. Он рисует другую вертикальную линию, на этот раз в нижней половине формы. На этот раз результат - радуга, которая оттеняет от синего до красного.

Источник: http://csharphelper.com/blog/2014/09/map-numeric-values-to-colors-in-a-rainbow-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 4,50 из 5)
Adblock
detector