2009-04-08 2 views
31

私は色のための16進文字列を必要とするいくつかのチャートを生成しています。色を表すランダムな16進数文字列を作成するにはどうすればよいですか?

例:

<dataseries name="ford" color="FF00FF" /> 

私は動的にこれらを作成していますので、私はランダムに各dataseries用進コードを生成したいと思います。

これを行うにはどのような方法が最適ですか?

+0

私の例には気がつかなかった。それはXML文字列だったので、それを推測しています...ああ、それは答えがうまくいったので問題はありませんでした。 – rahkim

+1

@rahkim - それを修正してより意味のあるタイトルを追加した更新された質問 –

答えて

94

最も簡単な方法は、String.Formatを使用して、引数に16進数形式を使用することです。

var random = new Random(); 
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9" 
+2

+1それはとてもすごくシンプルでクリアで速いです。 –

+0

私はまず、配列とピッキング要素を使用することを考えていましたが、String.Formatが16進数を行うことができることを覚えています。 – Samuel

+2

私が間違っている場合は私を修正しますが、そのコードでは、Nextメソッドに渡す整数が非包含的な上限であるため、値0xFFFFFFを生成することはありません。 0xFFFFFFが返されるためにはrandom.Next(0x1000000)が必要です。 –

4
Random rand = new Random(); // specify a seed 
int r = rand.Next(0x1000000); 
Console.WriteLine("#{0:X6}", r); 
+1

これは低い値を扱いません。 0x00FFFFは#FFFFとなり、#00FFFFと同じではありません。 – Samuel

15

あなたは人間の目で識別可能である色を必要とするようIMO、純粋にランダムな色は好ましくないことがあります。

いくつかの色をプリセットしてランダムに選ぶのはどうですか?

おそらく、あなたはいくつかのオープンソースの図書館のライブラリでより良い回答を見つけることができます。

+0

これは好ましい方法ですが、OPには完全にランダムな色の他の理由があるかもしれません。 – Samuel

+0

いくつかの色が混ざり合っているので、私はこれについて考えました。私はシリーズの非常に高い数を持つことができたので、どのくらい多くのプリセットをしたかはわかりませんでした。 – rahkim

+0

プリセットとランダムのハイブリッドが役に立ちます。慎重に約10の見栄えの良い色を事前に設定します。それ以上の場合はランダムに行ってください。一般的に、訓練されていない目は、色のついた図で混乱し始めます。実際に使用されている正確な色は実際には重要ではない – Canton

12

サミュエルの答えがこれを行う最善の方法です。new Random()がシステムクロックを使用してジェネレータにシードを与えるため、新しいRandomオブジェクトをインスタンス化しないループ内の色を生成する場合は、あなたのループは時計が目にするよりも速く動くので、randomに同じ値が設定されているので、同じ色を繰り返し生成することになります。

それは次のようになります。

int numColors = 10; 
var colors = new List<string>(); 
var random = new Random(); // Make sure this is out of the loop! 
for (int i = 0; i < numColors; i++) 
{ 
    colors.Add(String.Format("#{0:X6}", random.Next(0x1000000))); 
} 

の代わり:

int numColors = 10; 
var colors = new List<string>(); 
for (int i = 0; i < numColors; i++) 
{ 
    var random = new Random(); // Don't put this here! 
    colors.Add(String.Format("#{0:X6}", random.Next(0x1000000))); 
} 
+0

素敵な読書! –

+1

これは、rahkimがブレークポイントを使用するときにランダムな色を取得する理由を説明しています。笑 – Samuel

+0

これは私の心を越えさえしません。 理由のためにリストに色を追加していますか?ただ良い練習、または何かが欠けているのですか? – rahkim

11

色の素敵なセットを生成するための良い方法は、固定彩度や明度を使用してそれらを定義して変化させることです色相

  1. 彩度と明るさを好みの50%の彩度と90%の明るさに設定します。
  2. ここで、360度の色相を必要な色の数で割ります。
  3. これはあなたに彼らが同じ「設定」から来たようにすべてが見える色の素敵なセット、与え

色相のためにその間隔を使用してHSVから色を選んで、固定SとV. - すべてをパステル、またはすべての激しい、またはすべてのオフホワイト、何でも。そして、Color.FromHSV()を持っていれば、簡単にコード化することができます。

色が多すぎると作業が中断する可能性がありますが、区別がつかないことがあります。とにかく、おそらくその問題を起こすでしょう。擬似コードで

Sat = 0.5 * 255 //assuming we want range 0-255... 
Brightness = 0.9 * 255 
NumberOfColours = 7 
HueSeparation = 360/7 
Colors = [] 
for (i = 0 ; i< NumberOfColours; i++) 
    Colors.Add(Color.FromHSV(HueSeparation * i, Sat, Brightness) 

または

n = 7 
Colors = [Color.FromHSV(x*360/n, 128, 230) for x in range(n)] 

(私はリスト内包好きです...)

+0

すてきなアイデア。私はそれをコードに入れたいと思っています。 ;-) – rahkim

3

グレッグの記事には、(彩度とバリューを一定に保ち、色相を変えるだけでいいアイデアを)コードに入れることができればと思っています。あなたはできる!または、むしろ、誰かがすでにあなたのために持っています!

私はConverting HSV to RGB colour using C#にこのブログ記事を見つけました。そこにはさらに多くの情報があると確信しています。おそらく、色を完全にランダムに選ぶよりも、このように色の組み合わせが良いでしょう。

また、当然のことながら、この方法では、それは、単純な色の素敵なセットを取得することができます...色合いは0から359からなるので、このようなあなたのフエ何か設定のように、あなたが何かをすることができます:

Hue = (PreviousHue + 50) % 360; 

(これは360に均等には入っていないので50を選んだので、360を超えてもすぐに色相が繰り返されるわけではありません。あなたが期待しているさまざまな色)。

この方法では、コードが1つのアノトに近い2つの色をランダムに選択している場合を心配する必要はありませんそれでも未使用の「色相」空間がたくさんあるときは、

+0

私はこれが好きです。それは私にいくつかの柔軟性を与えます。 – rahkim

関連する問題