I\'d like to have an enumeration of Colors based on the rainbow colors (red... yellow... green... blue...).
I see basically two ways to do that:
Cre
I like to use this:
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);
}
}
Just use the Rainbow.dll
. This is probably not the best library, but for a smooth Rainbow effect on, I think, every WinForm Control you want, this is it.
Link: https://marschalldev.com/2018/08/02/csharp-rainbow-effect-net-dll/
How to use:
Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);
Here's one I like to use (the output is an HTML RGB color):
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");
}
In winforms(or anything using GDI+) you could use System.Drawing.Drawing2D.LinearGradientBrush to do the interpolation for you.
WPF's System.Windows.Media.GradientBrush could work as well. It's abstract so you might end up with WPF's LinearGradientBrush. It's in a different namespace than the other.
EDIT: since the question was edited to indicate that you want to be tech independent I don't think this answer applies. I'm going to leave it here for now in case someone is looking for Gradients in C#, but if someone finds that objectionable I'll remove the answer.
I did a quick check to see if you could at least get at some of the functionality in a more independent way (such as getting an array of Point or something). Doesn't appear to be the case.
Start here: http://www.midnightkite.com/color.html
You can interpret this: http://www.physics.sfasu.edu/astro/color/spectra.html it's FORTRAN, but it's pretty obvious what it does.
Also, you can read more in-depth here: http://en.wikipedia.org/wiki/CIE_1931_color_space
Here's a version in Python: http://www.johnny-lin.com/py_code/wavelen2rgb.py
BTW, the first google hit for C# is this: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx
This is easier than you think.
First you need an hsv or hsl to rgb conversion function. Here is C# code to do that conversion.
Then you simply iterate over all of the possible values of the hue h
while keeping the saturation
s and luminosity l
constant.
If you want 100 colors of the rainbow spaced out equally:
for(double i = 0; i < 1; i+=0.01)
{
ColorRGB c = HSL2RGB(i, 0.5, 0.5);
//do something with the color
}
You could also easily create your desired function GetRainbowColor
this way by adding all of these colors to a List<ColorRGB>
and returning the appropriate indexed color.