Как получить градиент цвета радуги в C#?

Я хотел бы иметь перечисление цветов, основанных на цветах радуги(красный... желтый цвет... зеленый... синий...).

Я вижу в основном два способа сделать это:

  1. создайте таблицу поиска, содержащую некоторые важные ссылочные цвета и интерполируйте между ними. Мне не нравится эта идея.

  2. применить более или менее причудливую математику. Наверное, меньше, но я не совсем понимаю, как это работает. Любой идеи?

(О, и хотя я провел некоторые исследования, я не нашел хороших результатов. Если этот вопрос уже был опубликован, просто укажите мне место, и я удалю это.)

Edit: я бы предпочел иметь это независимо от используемой технологии для отображения градиента. Например, что-то вроде GetRainbowColor (float f) с f в диапазоне от 0 (красный) до 1 (фиолетовый) будет отлично работать.

6 ответов


это проще, чем вы думаете.

сначала вам нужна функция преобразования hsv или hsl в rgb. вот код C# для этого преобразования.

затем вы просто повторяете все возможные значения hue h удерживая saturation s и светимость l константы.

если вы хотите 100 цветов радуги растянуты одинаково:

for(double i = 0; i < 1; i+=0.01)
{
    ColorRGB c = HSL2RGB(i, 0.5, 0.5);
    //do something with the color
}

вы также можете легко создать нужную функцию GetRainbowColor этот способ, добавив все эти цвета в List<ColorRGB> и возврат соответствующего индексированного цвета.


Мне нравится использовать этот:

public static Color Rainbow(float progress)
{
    float div = (Math.Abs(progress % 1) * 6);
    int ascending = (int) ((div % 1) * 255);
    int descending = 255 - ascending;

    switch ((int) div)
    {
        case 0:
            return Color.FromArgb(255, 255, ascending, 0);
        case 1:
            return Color.FromArgb(255, descending, 255, 0);
        case 2:
            return Color.FromArgb(255, 0, 255, ascending);
        case 3:
            return Color.FromArgb(255, 0, descending, 255);
        case 4:
            return Color.FromArgb(255, ascending, 0, 255);
        default: // case 5:
            return Color.FromArgb(255, 255, 0, descending);
    }
}

в winforms (или что-нибудь с помощью GDI+) вы можете использовать систему.Рисунок.Drawing2D.Lineargradientbrush для осуществления интерполяции для вас.

система WPF.Окна.Сми.GradientBrush также может работать. Это абстрактно, поэтому вы можете получить LinearGradientBrush WPF. Он находится в другом пространстве имен.

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

Я быстро проверил, можете ли вы, по крайней мере, получить некоторые функции более независимым способом (например, получить массив точек или что-то еще). Не тот случай.


вот один, который мне нравится использовать (выход - цвет HTML RGB):

public static String Rainbow(Int32 numOfSteps, Int32 step)
        {
            var r = 0.0;
            var g = 0.0;
            var b = 0.0;
            var h = (Double)step / numOfSteps;
            var i = (Int32)(h * 6);
            var f = h * 6.0 - i;
            var q = 1 - f;

            switch (i % 6)
            {
                case 0:
                    r = 1;
                    g = f;
                    b = 0;
                    break;
                case 1:
                    r = q;
                    g = 1;
                    b = 0;
                    break;
                case 2:
                    r = 0;
                    g = 1;
                    b = f;
                    break;
                case 3:
                    r = 0;
                    g = q;
                    b = 1;
                    break;
                case 4:
                    r = f;
                    g = 0;
                    b = 1;
                    break;
                case 5:
                    r = 1;
                    g = 0;
                    b = q;
                    break;
            }
            return "#" + ((Int32)(r * 255)).ToString("X2") + ((Int32)(g * 255)).ToString("X2") + ((Int32)(b * 255)).ToString("X2");
        }

начните здесь:http://www.midnightkite.com/color.html

вы можете интерпретировать это:http://www.physics.sfasu.edu/astro/color/spectra.html это FORTRAN, но довольно очевидно, что он делает.

также, вы можете прочитать более подробные здесь: http://en.wikipedia.org/wiki/CIE_1931_color_space

вот версия на Python:http://www.johnny-lin.com/py_code/wavelen2rgb.py

кстати, первый хит google для C# это:http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx


http://colorfulconsole.com/ Позволяет в значительной степени то, что вы ищете, также может быть установлен как пакет NuGet. Это не совсем Радужный градиент. Но он может писать градиенты на консоль, также это путает IDE между

Colorful.Console

и

System.Console

поэтому обязательно определите правильную консоль.