私は色のための16進文字列を必要とするいくつかのチャートを生成しています。色を表すランダムな16進数文字列を作成するにはどうすればよいですか?
例:
<dataseries name="ford" color="FF00FF" />
私は動的にこれらを作成していますので、私はランダムに各dataseries用進コードを生成したいと思います。
これを行うにはどのような方法が最適ですか?
私は色のための16進文字列を必要とするいくつかのチャートを生成しています。色を表すランダムな16進数文字列を作成するにはどうすればよいですか?
例:
<dataseries name="ford" color="FF00FF" />
私は動的にこれらを作成していますので、私はランダムに各dataseries用進コードを生成したいと思います。
これを行うにはどのような方法が最適ですか?
最も簡単な方法は、String.Format
を使用して、引数に16進数形式を使用することです。
var random = new Random();
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
+1それはとてもすごくシンプルでクリアで速いです。 –
私はまず、配列とピッキング要素を使用することを考えていましたが、String.Formatが16進数を行うことができることを覚えています。 – Samuel
私が間違っている場合は私を修正しますが、そのコードでは、Nextメソッドに渡す整数が非包含的な上限であるため、値0xFFFFFFを生成することはありません。 0xFFFFFFが返されるためにはrandom.Next(0x1000000)が必要です。 –
Random rand = new Random(); // specify a seed
int r = rand.Next(0x1000000);
Console.WriteLine("#{0:X6}", r);
これは低い値を扱いません。 0x00FFFFは#FFFFとなり、#00FFFFと同じではありません。 – Samuel
あなたは人間の目で識別可能である色を必要とするようIMO、純粋にランダムな色は好ましくないことがあります。
いくつかの色をプリセットしてランダムに選ぶのはどうですか?
おそらく、あなたはいくつかのオープンソースの図書館のライブラリでより良い回答を見つけることができます。
サミュエルの答えがこれを行う最善の方法です。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)));
}
色の素敵なセットを生成するための良い方法は、固定彩度や明度を使用してそれらを定義して変化させることです色相
色相のためにその間隔を使用して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)]
(私はリスト内包好きです...)
すてきなアイデア。私はそれをコードに入れたいと思っています。 ;-) – rahkim
グレッグの記事には、(彩度とバリューを一定に保ち、色相を変えるだけでいいアイデアを)コードに入れることができればと思っています。あなたはできる!または、むしろ、誰かがすでにあなたのために持っています!
私はConverting HSV to RGB colour using C#にこのブログ記事を見つけました。そこにはさらに多くの情報があると確信しています。おそらく、色を完全にランダムに選ぶよりも、このように色の組み合わせが良いでしょう。
また、当然のことながら、この方法では、それは、単純な色の素敵なセットを取得することができます...色合いは0から359からなるので、このようなあなたのフエ何か設定のように、あなたが何かをすることができます:
Hue = (PreviousHue + 50) % 360;
を
(これは360に均等には入っていないので50を選んだので、360を超えてもすぐに色相が繰り返されるわけではありません。あなたが期待しているさまざまな色)。
この方法では、コードが1つのアノトに近い2つの色をランダムに選択している場合を心配する必要はありませんそれでも未使用の「色相」空間がたくさんあるときは、
私はこれが好きです。それは私にいくつかの柔軟性を与えます。 – rahkim
私の例には気がつかなかった。それはXML文字列だったので、それを推測しています...ああ、それは答えがうまくいったので問題はありませんでした。 – rahkim
@rahkim - それを修正してより意味のあるタイトルを追加した更新された質問 –