3

私は色を調整する必要があり、色の範囲がほぼ無限であるという伝説があります(50〜100の識別子に関しては無限です。色のスペクトルを虹のように使用し、色の数から色を均等に分配したいと思います凡例のアイテム。たとえば。

プール A、B、C があり、それらを色で区別したいと考えています。A は赤、B はオレンジ、C は緑などです。000000 から FFFFFF までの 16 進数のカラー コードを使用して、これを動的に把握したいと考えています。したがって、私のプールはその範囲内の 3 つの色を均等に選択します。10 個のプールがある場合、10 個の色が均等に選択されます。これを行うのに最適なアルゴリズムは何でしょうか?

これは JavaScript で実行されますが、SASS で実行したいと考えています。

4

2 に答える 2

6

アルゴリズムを人間のものにすることを強くお勧めします。取引を知っている誰かに、あなたのために 100 色を選択してもらい (最初に最も目を楽しませてください)、これを静的配列として使用し、インデックス 0..N を使用します。 -1.

つまり、一般的なアルゴリズムは、PAL/NTSC カラー モデルを使用することです。

R=Y+V/0.88
G=Y-0.38*U-0.58*V
B=Y+U/0.49

U/V は色の座標で、Y は明るさです。

1したがって、U/V 平面のを中心とする半径の円を作成し、その0/0上に N 個の点をマークします。これは、U=cos(phi)、V=sin(phi)、phi が 0..360 の場合に簡単に実行できます。度を N ステップで指定します。これにより、N (U/V) タプルの配列が得られます。

目を楽しませる Y (ca. 0.5) を使用して、上記のように RGB 値を計算すると、N (R/G/B) タプルの配列が得られます。

于 2012-05-24T04:51:05.900 に答える
2

あなたが何を求めているのか正確にはわかりませんが、これは役立つかもしれません。w=0(赤)からw=1.0(紫)までの虹色を吐き出します。N色に均等に分割したい場合は、次のようにします。

for(int i = 0; i<N; i++){
  colors[i] = spectrum(i/((double)(N-1)));
}

この方法の使用:

public Color spectrum(double w) {
if (w>1)w=1;
if (w<0)w=0;

w=w*(645-380)+380;
double R,B,G;
if (w >= 380 && w < 440){
    R = -(w - 440.) /(440. - 350.);
    G = 0.0;
    B = 1.0;
}
else if (w >= 440 && w < 490){
    R = 0.0;
    G = (w - 440.) /(490. - 440.);
    B = 1.0;
}
else if (w >= 490 && w < 510){
    R = 0.0;
    G = 1.0;
    B = (510-w) /(510. - 490.);
}
else if (w >= 510 && w < 580){
    R = (w - 510.) /(580. - 510.);
    G = 1.0;
    B = 0.0;
}
else if (w >= 580 && w < 645){
    R = 1.0;
    G = -(w - 645.) /(645. - 580.);
    B = 0.0;
}
else if (w >= 645 && w <= 780){
    R = 1.0;
    G = 0.0;
    B = 0.0;
}
else{
    R = 0.0;
    G = 0.0;
    B = 0.0;
}
return new Color(R,G,B);

}

申し訳ありませんが、javascript ではありません。私はJavaにはるかに流暢です。そこにある数字はナノメートル単位の波長にマッピングされているので、あらゆる種類のものに役立ちます. もちろん、R、G、B の値は、255 を掛けて小数を切り捨てることにより、int に変換できます。

于 2012-05-24T04:52:48.297 に答える