3

その間隔カウントの数intervalsと位置( )に基づいて、さまざまなグレーの色合いを取得したいと思います。index

したがって、関数は次のようになります。

public static string GetShade(string StartColour, string EndColour, int Intervals, int Index)
{ ... }

したがって、次のようになります。

 GetShade("#aaaaaa", "#eeeeee", 5, 2) = "#bbbbbb"
 GetShade("#333333", "#555555", 3, 3) = "#555555"

(明らかに、私の開始と終了が灰色の場合、それは灰色にのみ関係します)。

ポインタはありますか?

4

3 に答える 3

2

色の各コンポーネントは、0〜255の数値の16進表現です。

あなたがする必要があるのはすることだけです:

int shade = 255/Intervals * index;
return string.format("{0:X}{0:X}{0:X}", shade);

上記には丸めタイプの問題があるかもしれませんが、上記は必要な一般的な概念です。

于 2013-03-27T08:18:42.423 に答える
2

さて、これまでに何を試したかについてはあまり言及されていなかったので、最初から立ち往生していると思います。

私はおそらく次のようにこれにアプローチします:

  1. 開始色と終了色を文字列からの数値として3つのコンポーネントに分解します(文字列では実際には計算できません)
  2. 間隔(startend )を分割し、正しい分割を選択して、必要な答えを見つけます(単純な算術、 start +(endstart)÷ intervalsindexのようなものにする必要があります)
  3. カラーストリングを組み立て直します。先行ゼロを考慮に入れるように注意してください。つまり、のようなものを使用してくださいstring.Format("{0:X2}{1:X2}{2:X2}", r, g, b)
于 2013-03-27T08:20:27.360 に答える
1

特別な文字列表現が必要であるという事実は、関数の外に置く必要があります。色の処理はタスクです。文字列との間の色のフォーマットは別のタスクであり、別の関数で処理する必要があります。

詳細に説明されている基本的な数学は次のようになります。

      public static Color GetShade(Color start, Color end, byte intervals, byte index)
      {
        var deltaR = end.R - start.R;
        var deltaG = end.G - start.G;
        var deltaB = end.B - start.B;

        var intervalR = deltaR / intervals;
        var intervalG = deltaG / intervals;
        var intervalB = deltaB / intervals;

        var finalR = start.R + (index * intervalR);
        var finalG = start.G + (index * intervalG);
        var finalB = start.B + (index * intervalB);

        return new Color { R = (byte)finalR, G = (byte)finalG, B = (byte)finalB };
      }
于 2013-03-27T08:29:05.600 に答える