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

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

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

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

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

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

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

Ответ 1

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

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

Затем вы просто перебираете все возможные значения оттенка h, сохраняя константу saturation и luminosity 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> и вернув соответствующий индексированный цвет.

Ответ 2

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

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);
    }
}

Ответ 3

В winforms (или что угодно, используя GDI +) вы можете использовать System.Drawing.Drawing2D.LinearGradientBrush, чтобы сделать интерполяцию для вас.

WPF System.Windows.Media.GradientBrush может работать. Это абстрактно, чтобы вы могли получить WPF LinearGradientBrush. Это в другом пространстве имен, чем в другом.

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

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

Ответ 4

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

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");
        }

Ответ 5

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

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

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

Здесь версия в Python: http://www.johnny-lin.com/py_code/wavelen2rgb.py

Кстати, первым хитом Google для С# является следующее: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

Ответ 6

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

Colorful.Console

и

System.Console

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

Ответ 7

Просто используйте Rainbow.dll. Это, вероятно, не лучшая библиотека, но для плавного эффекта Rainbow, я думаю, на каждом элементе управления WinForm, который вы хотите, вот оно.

Ссылка: https://marschalldev.com/2018/08/02/csharp-rainbow-effect-net-dll/

Как использовать: Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);