レインボーカラー(赤...黄...緑...青...)に基づいた色の列挙が欲しいのですが。
基本的に2つの方法があります。
いくつかの重要な参照色を含むルックアップテーブルを作成し、これらの間を補間します。私はこの考えがまったく好きではありません。
多かれ少なかれ派手な数学を適用します。おそらく少ないですが、それがどのように機能するのかよくわかりません。何か案は?
(ああ、私がいくつかのSO調査を行ったが、良い結果は見つかりませんでした。この質問がすでに投稿されている場合は、場所を指定してください。これを削除します。)
編集: グラデーションを表示するために、これを使用されているテクノロジーとは独立させたいと思います。たとえば、fが0(赤)から1(紫)の範囲のGetRainbowColor(float f)のようなものがうまく機能します。
これはあなたが思っているより簡単です。
まず、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
}
これらの色をすべてList<ColorRGB>
に追加し、適切なインデックスカラーを返すことで、この方法で目的の関数GetRainbowColor
を簡単に作成することもできます。
私はこれを使うのが好きです:
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);
}
}
これが私が使いたいものです(出力は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");
}
Winforms(またはGDI +を使用するもの)では、System.Drawing.Drawing2D.LinearGradientBrushを使用して補間を行うことができます。
WPFのSystem.Windows.Media.GradientBrushも同様に機能する可能性があります。これは抽象的であるため、WPFのLinearGradientBrushになってしまう可能性があります。他の名前空間とは異なる名前空間にあります。
編集:あなたが技術に依存しないことを望むように質問が編集されたので、私はこの答えが当てはまらないと思います。誰かがC#でグラデーションを探している場合に備えて、ここに残しておきますが、誰かがそれを好ましくないと感じた場合は、答えを削除します。
少なくともいくつかの機能をより独立した方法で取得できるかどうかを確認するために簡単なチェックを行いました(Pointの配列などを取得するなど)。そうではないようです。
_Rainbow.dll
_を使用するだけです。これはおそらく最良のライブラリではありませんが、必要なすべてのWinFormコントロールにスムーズなRainbow効果を与えるには、これが最適だと思います。
リンク: https://marschalldev.com/2018/08/02/csharp-Rainbow-effect-net-dll/
使用方法:Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);
http://colorfulconsole.com/ 探しているものをほぼ許可し、NuGetパッケージとしてインストールすることもできます。正確にはレインボーグラデーションではありません。しかし、それはコンソールにグラデーションを書き込むことができます、またこれはIDEとの間で混乱します
Colorful.Console
そして
System.Console
したがって、必ず適切なコンソールを定義してください。
ここから始めてください: 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
ところで、C#の最初のグーグルヒットはこれです: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx