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

<p>я хотел бы иметь перечисление цветов, основанных на цветах радуги (красный ... желтый ... зеленый ... синий ...).</p><p>я вижу в основном два способа сделать это:</p><ol> <li> <p>создайте таблицу поиска, содержащую некоторые важные эталонные цвета, и интерполируйте их. мне вообще не нравится эта идея.</p> </li> <li> <p>примените более или менее причудливую математику. наверное, меньше, но я не совсем понимаю, как это работает. есть идеи?</p> </li> </ol><p>(о, и хотя я провел so исследование, я не нашел хороших результатов. если этот вопрос уже был опубликован, просто укажите мне местоположение, и я удалю его.)</p><p><b>правка:</b> я бы предпочел иметь это независимо от используемой технологии для отображения градиента. например, что-то вроде getrainbowcolor (float f) с f в диапазоне от 0 (красный) до 1 (фиолетовый) будет отлично работать.</p>

<p>это проще, чем вы думаете.</p><p>сначала вам нужна функция преобразования hsv или hsl в rgb. <a href="http://geekymonkey.com/programming/csharp/rgb2hsl\_hsl2rgb.htm">вот код c # для этого преобразования</a> .</p><p>затем вы просто перебираете все возможные значения оттенка <code>h</code>, сохраняя при этом константу <code>saturation</code> и яркость <code>l</code>.</p><p>если вы хотите, чтобы 100 цветов радуги располагались одинаково:</p><pre><code>for(double i = 0; i < 1; i+=0.01) { colorrgb c = hsl2rgb(i, 0.5, 0.5); //do something with the color } </code></pre><p>вы также можете легко создать желаемую функцию <code>getrainbowcolor</code>, добавив все эти цвета в <code>list<colorrgb></code> и вернув соответствующий индексированный цвет.</p>

<p>мне нравится использовать это:</p><pre><code>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); } } </code></pre>

<p>вот то, что мне нравится использовать (вывод - цвет html rgb):</p><pre><code>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"); } </code></pre>

<p>в winforms (или в любом другом, использующем gdi +) вы можете использовать system.drawing.drawing2d.lineargradientbrush, чтобы выполнить интерполяцию за вас.</p><p>system.windows.media.gradientbrush из wpf также может работать. это абстрактно, так что вы можете получить lineargradientbrush от wpf. это в другом пространстве имен, чем другое.</p><p>правка: так как вопрос был отредактирован, чтобы указать, что вы хотите быть технологически независимым, я не думаю, что этот ответ применим. я собираюсь оставить это здесь пока, если кто-то ищет градиенты в c #, но если кто-то посчитает это нежелательным, я удалю ответ.</p><p>я сделал быструю проверку, чтобы посмотреть, сможете ли вы хотя бы получить некоторые функциональные возможности более независимым способом (например, получить массив point или что-то в этом роде). похоже, не в этом дело.</p>

<p> <a href="http://colorfulconsole.com/">http://colorfulconsole.com/</a> позволяет в значительной степени то, что вы ищете, также может быть установлен как пакет nuget. это не совсем градиент радуги. но он может записывать градиенты на консоль, что также приводит к путанице ide между</p><pre><code>colorful.console </code></pre><p>а также</p><pre><code>system.console </code></pre><p>поэтому не забудьте определить правильную консоль.</p>

<p>начните здесь: <a href="http://www.midnightkite.com/color.html">http://www.midnightkite.com/color.html</a> </p><p>вы можете интерпретировать это следующим образом: <a href="http://www.physics.sfasu.edu/astro/color/spectra.html">http://www.physics.sfasu.edu/astro/color/spectra.html</a> это фортран, но вполне очевидно, что он делает.</p><p>кроме того, вы можете прочитать более подробно здесь: <a href="http://en.wikipedia.org/wiki/cie\_1931\_color\_space">http://en.wikipedia.org/wiki/cie\_1931\_color\_space</a> </p><p>вот версия на python: <a href="http://www.johnny-lin.com/py\_code/wavelen2rgb.py">http://www.johnny-lin.com/py\_code/wavelen2rgb.py</a> </p><p>кстати, первый хит google для c # выглядит так: <a href="http://miguelmoreno.net/sandbox/wavelengthtorgb/default.aspx">http://miguelmoreno.net/sandbox/wavelengthtorgb/default.aspx</a> </p>