4

SVG の RGB パターンとして使用できるように、3 つの数値を生成する関数が必要です。
これは単純ですが、同じ色を 2 回使用していないことも確認する必要があります。どうすれば正確にそれを行うことができますか?シンプルrand(シード タイム アクティブ) で一度に 1 つの数値を生成し、次に何をしますか? 数字を除外したくないのですが、パターン全体でしょうか?
私はここでちょっと迷っています。

正確には、この関数を最初に呼び出すと、たとえば 218 199 154 が得られ、2 番目に 47 212 236 が得られます。これは間違いなく 2 つの異なる色です。助言がありますか?

structまた、これにはwithint r, int g, int bが適していると思いますか?

編集:色は人間の目とは異なるはずです。これについて先に言及せずに申し訳ありません。

4

4 に答える 4

2

簡単な方法は次のとおりです。

1.Generate a random integer.
2.Shift it 8 times to have 24 meaningful bits, store this integer value.
3.Use first 8 bits for R, second group of 8 bits for G,
      and the remaining 8 bits for B value.

新しい乱数ごとに、それを8回シフトし、以前に保存した他のすべての整数値を比較します。それらのいずれも新しい乱数と一致しない場合は、それを新しい色に使用します(ステップ3)。

知覚の閾値は人によって異なるため、人間の目による識別は興味深いトピックです。整数を 14 回シフトするには、R の最初の 6 ビットを取得し (再び 8 ビットを取得するために 2 つの 0 を埋めます)、G の 2 番目の 6 ビットを取得し、B の最後の 6 ビットを取得します。よかった、5,4 減ら​​して...

各チャネルに有効な 4 ビットを使用した単純な実行: 私のランダムな整数は次のとおりです。

0101-1111-0000-1111-0000-1100-1101-0000

それを左に 20 回シフトします (乗算またはモジュロも使用できます)。

0000-0000-0000-0000-0000-0101-1111-0000

この値を保存します。

次に、R の最初の 4 ビット、G の 2 番目の 4 ビット、B の最後の 4 ビットを取得します。

R: 0101
G: 1111
B: 0000

それらをパディングして、それぞれを 8 ビットにします。

R: 0101-0000
G: 1111-0000
B: 0000-0000

それらを色コンポーネントに使用します。

シフト後の新しい乱数ごとに、これまでに保存された整数値と比較します。異なる場合は、保管して色に使用してください。

于 2012-06-05T10:41:28.113 に答える
2

セットを使用して、生成された色を保存できます。最初に新しいセットをインスタンス化します。次に、色を生成するたびに、値がセットに存在するかどうかを確認します。レコードが存在する場合は、スキップして新しい色を再試行します。そうでない場合は、それを使用できますが、後でセットにキャッシュすることを忘れないでください。大量の色を生成する必要がある場合、これはパフォーマンスが低下する可能性があります。

于 2012-06-04T14:32:12.247 に答える
2

これを行う最も安価な方法は、メモリ量が非常に少ないブルーム フィルターを使用することです。基本的には、0 から 255 までの 3 つの乱数を作成し、好きなように保存して、トリプレットとしてハッシュし、ハッシュをフィルターに配置します。

また、#FFFFF0 と #FFFFF2 を区別するのはおそらく簡単ではないため、各チャネルの下位ビットを破棄することをお勧めします。

于 2012-06-04T14:42:16.623 に答える
1

1 つのアイデアは、生成された色のセットを表すためにビット ベクトルを使用することです。24 ビット精度の場合、ビット ベクトルの長さは 2 24ビットになり、16,777,216 ビット、つまり 2 MB になります。確かに、最近ではそれほど多くはありません。色を検索して挿入するのは非常に高速です。

于 2012-06-04T14:38:09.450 に答える