it-swarm.com.ru

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

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

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

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

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

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

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

19
mafu

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

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

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

30
Brian R. Bondy

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

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

Вот то, что мне нравится использовать (вывод - цвет 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
ProfNimrod

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

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

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

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

1
Mike Two

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

Colorful.Console

а также

System.Console

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

0
Ra1n

Начните здесь: 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

0
S.Lott