1

コーヒーを飲みすぎたのかもしれませんし、長時間働きすぎたのかもしれませんが、とにかく、この方法が何をするのか、またはなぜ、どのようにそれを行うのかについて、誰かが私に光を当てることができますか? ? ネクストカラーとは?

public Color nextColor() {
   int max = 0, min = 1000000000, cr = 0, cg = 0, cb = 0;
   for (int r = 0; r < 256; r += 4) {
      for (int g = 0; g < 256; g += 4) {
         for (int b = 0; b < 256; b += 4) {
            if (r + g + b < 256 || r + g + b > 512) {
               continue;
            }
            min = 1000000000;
            for (Color c : colorTable) {
               int dred   = r - c.getRed();
               int dgreen = g - c.getGreen();
               int dblue  = b - c.getBlue();
               int dif = dred * dred + dgreen * dgreen + dblue * dblue;
               if (min > dif) {
                  min = dif;
               }
            }
            if (max < min) {
               max = min;
               cr  = r;
               cg  = g;
               cb  = b;
            }
         }
      }
   }

   return new Color(cr, cg, cb, 0x90);
}

アップデート

皆様、ご回答ありがとうございます。プログラム内のメソッドのコンテキストを見ると、それらの意図が、既存の色のセットから「最も離れた」新しい色を返すことであったことは明らかです。

この質問へのフォローアップを提示してくれたSparrに感謝します.あなたのアドバイスを念頭に置いて上記を間違いなく書き直します.

私はRGBカラースケールに精通していません。上記のメソッドの意図を知ることは、「無料?」を検索することです。色を既存の色のセットに置き換えた場合、1で提供された解決策は実際に、色をどのように知覚するかという意味で補完的になりますか? セットを補完する色を選択する簡単な方法はありますか、それとも RGB コンポーネントの数値解析によって実際に適切な色が得られるのでしょうか?

4

4 に答える 4

3

色のリストを保存する colortable があるようです。

次に、この奇妙にハードコードされた色空間があります

4の倍数の成分を持ち、「明るすぎず」でも「暗すぎず」でもない色。

この関数は、カラーテーブルと最も「対照的」な後者の色を提供しているようです。

コントラストと言うとき、これは 2 ノルムを使用してカラー テーブルから可能な限り離れた色を選択することによって定義されます。

于 2009-02-26T04:54:56.460 に答える
1

colorTable という名前の Color オブジェクトのグローバル配列を指定すると、この関数は、次の色空間からその配列内の各色に最も近い*色を見つけ、次にそれらの色の中で最も遠い色の 1 つを見つけます。

赤、緑、青のコンポーネント 256 から 512 の間の赤 + 緑 + 青の 4 の倍数

*:「最も近い」は、各色成分の差の二乗和の最小値として定義されます。

Paul が判断したように、これは、colorTable の内容との高いコントラストを提供する単一の色を見つけるための、非常に非効率的に実装されているとしても、もっともらしいアプローチのように思えます。同じ結果は、colorTable を 500 万回通過する代わりに、colorTable を 1 回通過し、もう少し計算することで見つけることができます。平均コントラストがはるかに高い別の色を見つけるには、はるかに優れた方法があります。

于 2009-02-26T05:00:44.060 に答える
0

colorTableのポイントによって定義された疑似ソリッドの内部に大きな「くぼみ」があり、nextColorがそのくぼみの中心にあるポイントをnextColorとして選択する場合を考えてみます。colorTableについて知っていることによっては、このケースは非常にまれな場合があります。それが十分にまれであると予測され、そのような場合に最適ではない(nextColorの出力が最適であると仮定して)ソリューションを受け入れることをいとわない場合、重要な最適化が現れます。

上記の場合を除くすべての場合で、nextColorによって選択される色は、ループによって定義された1/64の密な色空間内のすべての点を囲む最小の凸包の表面のどこかになります。その表面上の点のリストを生成することは、すべての点のリストを生成する単純なループよりも計算が少し複雑ですが、検索スペースが約25分の1に減少します。

ほとんどの場合、その簡略化された検索の結果は、その凸包の角の1つにあるポイントになります。それらだけを考慮すると、検索スペースが簡単なリスト(私の精神的な幾何学がうまく機能する場合は、24の候補)になり、事前に簡単に保存できます。

それらから選択されたnextColorがcolorTableに「近すぎる」場合は、上記の種類の「中空」を見つけることを期待して、元のタイプの検索の実行にフォールバックできます。その検索の密度は、最初のパスがどれだけ近づいたかに基づいて調整し、そこから絞り込むことができます。つまり、超高速検索でcolorTable内の最近傍から8単位離れたnextColorが見つかった場合、それよりもうまく行うには、colorTable内で少なくとも16単位のくぼみを見つける必要があります。ステップ8で元の検索を実行し、4単位以上離れた候補を保存し(くぼみが検索グリッドと整列する可能性は低い)、それらの候補のそれぞれに高密度の半径12の検索を中央に配置します。

あなたの検索スペースの1/64密度の性質(4の倍数すべて)は、そもそも検索を高速化する目的で、おそらく元の作成者によって作成されたものだと思います。これらの改善を考えると、その妥協をなくすことができます。

これはすべて、対照的な色を見つけるこの素朴な方法の改善に固執したいことを前提としています。同等以上の情報(colorTableのどの色が使用法で最も一般的ですか?人間の目にはどの色がよりコントラストが強いですか?)情報が与えられれば、確かにより良い方法があります。

于 2009-02-28T03:19:10.057 に答える
0

それはあなたのために別の色を手に入れようとしています

a) データセットの偽色コーディング。

b) グラフに別の線を引く。

于 2009-02-26T05:12:35.763 に答える