web-dev-qa-db-ja.com

一意の色を生成するためのアルゴリズム

色ができるだけ広く分布するように(簡単に混同されないように)一連の色を生成するアルゴリズムを探しています。

IDが1からカウントアップする一連のオブジェクトがあります。これらの各オブジェクトを、隣のオブジェクトと簡単に混同されないように、見た目に美しい色で表現したいと思います。ただし、色は必ずしもランダムである必要はありません。同じIDを入力するたびに同じ色にしたいのですが。

26
Bridger Maxwell

可能な要素の数には妥当な下限がありますか?すばやく簡単な解決策の1つは、アイテムのIDを使用して色の値の配列を格納することです。これは、色の量が比較的少ないことを前提としていますが、特定の数のアイテムを超えることはないと確信しています。

リストを使用するのではなく色を生成したい場合、一貫性のある適切な外観にするための1つのトリックは、HSBを使用して色を生成することです。明るさと彩度を事前に定義してから、IDのいくつかの関数に基づいて色相値を決定します(これは、持つ予定のIDの数に応じてさまざまなものになりますが、IDにある程度の量を掛けます(そしてそれを超えると改造します) 255!)は、大まかなアプローチとして適しています。このアプローチでは、彩度と明るさの点ですべての色が「整列」しますが、それぞれに異なる色があります。

私は仕事で少し退屈しているので、私は速い解決策を一緒に泡立てました:

class HsbColor
{
    public int Hue { get; set; }
    public int Saturation { get; set; }
    public int Brightness { get; set; }

    public Color ToRGB
    {
        // left as exercise to the reader...
    }
}

public class Item
{


    public int Id { get; set; }
    private static const byte EXPECTED_MAX = 15;
    private static int HUE_FACTOR = 255 / EXPECTED_MAX;

    public HsbColor Color 
    {
       get {

         var color = new HsbColor() { Saturation = 175, Brightness = 175 };

         color.Hue = (Id * HUE_FACTOR) % 255;

         return color;
       }
    }
}
8
Ryan Brunner

私はそれを行うためのすべての方法をチェックし、いくつかの方法を解決しました。そして最後に、CIEde2000で総当たり攻撃を行います。実際、最善の策は単なる静的リストです。何をしても、はっきりとした色が30色以上は得られません。色覚異常と混乱の線を考慮に入れると、あなたは本当に邪魔なものを作っています。ルックアップテーブルを使用して、色だけでなく他のいくつかの特性でデータポイントを変更します。

max difference color palette

#000000
#00FF00
#0000FF
#FF0000
#01FFFE
#FFA6FE
#FFDB66
#006401
#010067
#95003A
#007DB5
#FF00F6
#FFEEE8
#774D00
#90FB92
#0076FF
#D5FF00
#FF937E
#6A826C
#FF029D
#FE8900
#7A4782
#7E2DD2
#85A900
#FF0056
#A42400
#00AE7E
#683D3B
#BDC6FF
#263400
#BDD393
#00B917
#9E008E
#001544
#C28C9F
#FF74A3
#01D0FF
#004754
#E56FFE
#788231
#0E4CA1
#91D0CB
#BE9970
#968AE8
#BB8800
#43002C
#DEFF74
#00FFC6
#FFE502
#620E00
#008F9C
#98FF52
#7544B1
#B500FF
#00FF78
#FF6E41
#005F39
#6B6882
#5FAD4E
#A75740
#A5FFD2
#FFB167
#009BFF
#E85EBE
24
Tatarize

Idに 黄金比 (ファイ)を掛けて、数値0 <= n <1を得ることができます。生成する数値はすべて均等に分散される傾向があります。

PHI = (1 + sqrt(5))/2
n = id * PHI - floor(id * PHI) 

次に、その数値を色に変換する必要があります。

hue = floor(n * 256)
19

私はこれと同じトピックについての記事を書きました:

プログラムでランダムカラーを生成する方法

基本的に、HSV色空間を使用し、固定の彩度と明度を設定し、色相を変更できます。必要な色の数がわかったら、色相の範囲を分割するだけです[0,1[ これで。必要な色の数がわからない場合でも、黄金比を使用してこのスペースから色を選択できます。

10
martinus

グラフィックデザイナーは、情報ディスプレイで多くの色が互いに近くで使用される場合、色は色空間で互いに比較的近くなければならないことを知っています。彩度や色相の小さな変化は、通常、大きなジャンプよりも優れています。多くの色が関係している場合、人間の目は実際にそれを見つけます簡単色の距離があまり大きくないときに情報を吸収します。

また、一部のユーザーは色覚異常になることを忘れないでください。色覚異常には非常に多くの種類があるため、どの組み合わせを避けるべきかを知ることは困難です。多分誰か他の人がこの質問に答えることができますか?

10
Norman Ramsey