1

全て、

配列のインデックスに基づいて一意の色を生成するための優れたアルゴリズムはありますか?

もちろん、これはUIで使用され、多数の動的ボタンの背景色を設定します。

現在、.Net(および私の頭の上にあるJava)では、次のメソッドがサポートされています。

Color.FromArgb
Color.FromName

FromArgbは、argbカラーを含む32ビット整数を取ることができます。

ただし、アルゴリズムによるアプローチでは、配列内のアイテムの数によっては、一部の色の順序が類似しすぎる可能性があります。また、前景色が背景に似ている場合もあります。

私が考えることができる唯一の方法は、事前定義された色のセットを含むある種の色配列を作成することです。もちろん、これは手動のコード作業ですが、この方法で、狭い範囲で異なる色のセットを取得できます。最後に向かってシーケンスを繰り返す前に、互いに視覚的に異なるようにします。

もう1つの方法は、次を使用して色の配列を生成することです。

Enum.GetValues(typeof(KnownColor)

助言がありますか?

乾杯

4

2 に答える 2

1

インデックスをハッシュし、色のハッシュの下位 32 ビットを取得します。これはランダムに見えますが、均一な色の分布を生成するはずです。選択した色が互いに、または背景と視覚的に異なることを保証するものではありませんが、機能する場合があります。

また、配列のサイズがわかっていると仮定して、カラー スペクトル全体を取得し、それをn等間隔の色に分割して、配列の各要素に割り当てることもできます。

https://stackoverflow.com/a/43235/684934も良いアイデアを提供するかもしれません。

于 2012-08-01T15:10:13.583 に答える
0

RGB カラーは、色空間の 3D キューブを形成します。この立方体の角を選択することから始めます (0 または 255 の値)。次に、立方体を 8 つの立方体のグリッドに分割し、新しく形成された頂点を取ります。再び 64 個の立方体に分割し、新しく形成された頂点を取ります。これにより、インデックスが高いほど、色が徐々に近くなります。

IEnumerable<Color> GeneratePalette()
{
    for (int scale = 1; scale < 256; scale *= 2)
    {
        for (int r = 0; r <= scale; r++)
        for (int g = 0; g <= scale; g++)
        for (int b = 0; b <= scale; b++)
        {
            if (scale == 1 || (r & 1) == 1 || (g & 1) == 1 || (b & 1) == 1)
            {
                yield return new Color
                {
                    A = 255,
                    R = (byte) (255 * r / scale),
                    G = (byte) (255 * g / scale),
                    B = (byte) (255 * b / scale),
                };
            }
        }
    }
}

最初の数色:

#FF000000 
#FF0000FF 
#FF00FF00 
#FF00FFFF 
#FFFF0000 
#FFFF00FF 
#FFFFFF00 
#FFFFFFFF 
#FF00007F 
#FF007F00 
#FF007F7F 
#FF007FFF 
...
#FFFF7FFF 
#FFFFFF7F 
#FF00003F 
于 2012-08-01T17:46:27.360 に答える