Как получить градиент цвета радуги в C #? - PullRequest
20 голосов
/ 18 февраля 2010

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

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

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

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

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

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

Ответы [ 7 ]

31 голосов
/ 18 февраля 2010

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

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

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

7 голосов
/ 10 февраля 2014

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

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);
    }
}
1 голос
/ 26 августа 2014

Вот то, что мне нравится использовать (вывод - это цвет 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");
        }
1 голос
/ 18 февраля 2010

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

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

РЕДАКТИРОВАТЬ: так как вопрос был отредактирован, чтобы показать, что вы хотите быть технологически независимым, я не думаю, что этот ответ применим. Сейчас я оставлю это здесь на случай, если кто-то ищет градиенты в C #, но если кто-то посчитает это нежелательным, я удалю ответ.

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

0 голосов
/ 19 июня 2019

Просто используйте 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);

0 голосов
/ 01 октября 2017

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

Colorful.Console

и

System.Console

Так что не забудьте определить правильную Консоль.

0 голосов
/ 18 февраля 2010

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

Вы можете интерпретировать это: http://www.physics.sfasu.edu/astro/color/spectra.html это ФОРТРАН, но вполне очевидно, что он делает.

Кроме того, вы можете прочитать более подробно здесь: 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

...