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

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

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

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

  2. Примените некоторую более или менее необычную математику. Вероятно, меньше, но я не вполне вижу, как это работает. Какие-либо идеи?

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

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

20
задан mafu 18 February 2010 в 12:30
поделиться

3 ответа

Самый простой способ обработки - это получить ваш ввод в std:: wstring (который логически является массивом wchar _ t ). Однако подстроки разделяются L '' , и L '।' также будет отдельным. Например, можно вызвать input.find _ first _ of (L «।»)

-121--3791883-

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

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

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

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

-121--2140035-

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

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

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

31
ответ дан 29 November 2019 в 23:52
поделиться

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

BTW, первый запрос в Google по C# - вот этот: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

0
ответ дан 29 November 2019 в 23:52
поделиться

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

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

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

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

1
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: