20

虹色(赤…黄…緑…青…)に基づいた色を列挙したいのですが。

私はそれを行うために基本的に2つの方法を見ます:

  1. いくつかの重要な参照色を含むルックアップテーブルを作成し、これらの間を補間します。私はこの考えがまったく好きではありません。

  2. 多かれ少なかれ派手な数学を適用します。おそらく少ないですが、それがどのように機能するのかよくわかりません。何か案は?

(ああ、私がいくつかのSO調査を行っている間、良い結果は見つかりませんでした。この質問がすでに投稿されている場合は、場所を指定してください。これを削除します。)

編集:グラデーションを表示するために使用されているテクノロジーとは別に、これを使用したいと思います。たとえば、fが0(赤)から1(紫)の範囲のGetRainbowColor(float f)のようなものがうまく機能します。

4

8 に答える 8

33

これは思ったより簡単です。

まず、hsv または hsl から rgb への変換関数が必要です。 その変換を行う C# コードを次に示します。

次に、 s と明度を一定hに保ちながら、色相のすべての可能な値を単純に反復処理します。saturationl

虹の 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>、適切なインデックス付きの色を返すことにより、この方法で目的の関数を簡単に作成することもできます。

于 2010-02-18T12:28:30.347 に答える
9

私はこれを使うのが好きです:

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);
    }
}
于 2014-02-10T11:53:54.893 に答える
1

winforms (または GDI+ を使用するもの) では、 System.Drawing.Drawing2D.LinearGradientBrush を使用して補間を行うことができます。

WPF の System.Windows.Media.GradientBrush も同様に機能します。これは抽象的であるため、WPF の LinearGradientBrush で終わる可能性があります。他の名前空間とは異なる名前空間にあります。

編集:質問は技術的に独立したいことを示すために編集されたので、この答えは当てはまらないと思います。誰かが C# でグラデーションを探している場合に備えて、ここに残しておきますが、誰かがそれを好ましくないと感じた場合は、回答を削除します。

少なくともいくつかの機能をより独立した方法で取得できるかどうかを確認するために簡単なチェックを行いました (ポイントの配列などを取得するなど)。そうではないようです。

于 2010-02-18T12:28:28.817 に答える
0

ここから始めましょう: 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# の最初の Google ヒットはこれです: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

于 2010-02-18T12:27:45.907 に答える
0
uint32_t Wheel(byte WheelPos) { // 0 - 255 return unit32_t
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); //red + green
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); //blue + red
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); //green + blue
  }
}

wheelpos == 5 の場合、(15, 240, 0) を返します。

6 = (18, 237, 0)

于 2021-09-23T18:08:57.650 に答える
-1

を使用するだけRainbow.dllです。これはおそらく最高のライブラリではありませんが、必要なすべての WinForm コントロールでスムーズなレインボー効果を実現するには、これが最適です。

リンク: https://marschalldev.com/2018/08/02/csharp-rainbow-effect-net-dll/

使い方: Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);

于 2019-06-18T22:50:53.997 に答える