6

特定の色でマップにプロットする必要がある値のリストがあります。nマップへのプロットは既に完了していますが、値をその値を表す色にマップする方法を見つける必要があります。

これまでの例と私の解決策は、に基づいて値を正規化し、最低と最高の 16 進数の色にmin割り当てるmaxことです。もちろん、これは私の自己をグレースケールに制限します。コードは次のとおりです。0255

$color = ($value / $max) * 255    // (min is zero)

しかし、たとえば値が青から赤に変わる場合、これを行うにはどうすればよいでしょうか? これを解決できる一般的なライブラリやツールはありますか? これまでのところ、私は見つけることができませんでした。

4

5 に答える 5

5

それを行うライブラリがあるかもしれません。ただし、一般的な原則について簡単に説明しましょう。一般に、次のオプションがあります。

  1. 定義済みのカラー インデックス。$coloridx=array(0=>'#FFFFFF',1=>'#FFEE00',...);
  2. 基本的に 3 つすべての RGB チャネル (R = 赤、G = 緑、B = 青) の反復ベースの適応である線形グラデーションなどの任意のアルゴリズム。
  3. 両方の組み合わせ。通常、複雑なアルゴリズムの結果をカラー インデックスに入れ、そこから移動します。

考慮事項にアルゴリズムを含める場合は、trueまたはがないことを理解する必要がありますfalse。それはすべて、実装したいものに依存します。n=0..10緑のバリエーションを にレンダリングし、それ以降のすべてに赤から黒を使用することが理にかなっている場合がありますn>10。キャップと乗数は、アクセントを設定するのに役立ちます。そういうもの。

線形グラデーションを実装する 1 つの方法は次のとおりです。

function lineargradient($ra,$ga,$ba,$rz,$gz,$bz,$iterationnr) {
  $colorindex = array();
  for($iterationc=1; $iterationc<=$iterationnr; $iterationc++) {
     $iterationdiff = $iterationnr-$iterationc;
     $colorindex[] = '#'.
        dechex(intval((($ra*$iterationc)+($rz*$iterationdiff))/$iterationnr)).
        dechex(intval((($ga*$iterationc)+($gz*$iterationdiff))/$iterationnr)).
        dechex(intval((($ba*$iterationc)+($bz*$iterationdiff))/$iterationnr));
  }
  return $colorindex;
}

$colorindex = lineargradient(
  100, 0, 0,   // rgb of the start color
  0, 255, 255, // rgb of the end color
  256          // number of colors in your linear gradient
);

$color = $colorindex[$value];

コードを更新して、コメントにフィードバックする dehex を追加しました。

于 2013-10-07T11:31:19.760 に答える