使用PHP设置基于变量数的颜色阴影



好吧,我甚至不知道从哪里开始!我会努力解释我想要实现的目标,然后我们将从那里开始。。。。

我有一个日期列表,每个日期都有一个相关的数字,比如20-100。我想做的是以阴影形式输出日期,该阴影表示相关数字。因此,20将以浅蓝色显示,100将以深蓝色显示。到目前为止,我的代码是这样的。。。

dateArray = Array('2001-01-01'=>30, '2001-02-01'=>40, '2001-03-01'=>50, '2001-04-01'=>60, '2001-05-01'=>70, '2001-06-01'=>80, '2001-07-01'=>90, '2001-08-01'=>90, '2001-09-01'=>80, '2001-10-01'=>70, '2001-11-01'=>60, '2001-12-01'=>50)  
$maxNum = max($dateArray);
$minNum = min($dateArray);
foreach($dateArray AS $date => $num){
$lightest = 'rgb(204,204,255)';
$darkest = 'rgb(0, 0, 179)';
///magic that converts $num into $shade goes here///
echo "<span style='color:$shade'>$date</span><br>" 
} 

有什么想法吗?感谢

我会这样做:

$dateArray = Array('2001-01-01'=>30, '2001-02-01'=>40, '2001-03-01'=>50,   '2001-04-01'=>60, '2001-05-01'=>70, '2001-06-01'=>80, '2001-07-01'=>90, '2001-08-01'=>90, '2001-09-01'=>80, '2001-10-01'=>70, '2001-11-01'=>60, '2001-12-01'=>50)
// get max and min values
$maxNum = max($dateArray);
$minNum = min($dateArray);
// set rgb values for max and min
$lightest = array(204, 204, 255);
$darkest = array(0, 0, 179);
foreach($dateArray AS $date => $num)
{
    // get a "delta" where the current num value is
    $delta = ($num / $maxNum) - $minNum;
    // get a pro-rata values thanks to $delta
    $shadesNum = array(
        $delta * ($lightest[0] - $darkest[0]) + $darkest[0],
        $delta * ($lightest[1] - $darkest[1]) + $darkest[1],
        $delta * ($lightest[2] - $darkest[2]) + $darkest[2]
    );
    echo "<span style='rgb(".implode(',', $shadesNum).")'>$date</span><br>";
}

有些语言有一个"lerp"函数-线性插值。非常有用。我的建议:

for ($x1=20; $x1<=100; $x1+=10)
  echo $x1 . ": " . getshade($x1) . "<br />n";
function getshade($num) {
  $rlight = 204;
  $glight = 204;
  $blight = 255;
  $rdark = 0;
  $gdark = 0;
  $bdark = 179;
  $lightnum = 20;
  $darknum = 100;
  $k01 = ($num-$lightnum)/($darknum-$lightnum); // 0 to 1
  $rshade = ilerp($rlight, $rdark, $k01);
  $gshade = ilerp($glight, $gdark, $k01);
  $bshade = ilerp($blight, $bdark, $k01);
  return "rgb($rshade,$gshade,$bshade)"; }
function lerp($start, $end, $k01) { // linear interpolation
  return $k01*$end + (1.0-$k01)*$start; }
function ilerp($start, $end, $k01) { // integer lerp
  return intval($k01*$end + (1.0-$k01)*$start); }

编辑:相同但更好:

$rgblight = [204,204,255];
$rgbdark = [0,0,179];
$numlight = 20;
$numdark = 100;
for ($x1=20; $x1<=100; $x1+=10)
  echo $x1 . ": " . getshade2($x1, $numlight, $numdark, $rgblight, $rgbdark) . "<br />n";
function getshade2($num, $numlight, $numdark, $rgblight, $rgbdark) {
  $k01 = ($num-$numlight)/($numdark-$numlight);
  for ($i1=0; $i1<3; $i1+=1)
    $rgb[$i1] = ilerp($rgblight[$i1], $rgbdark[$i1], $k01);
  return "rgb({$rgb[0]},{$rgb[1]},{$rgb[2]})"; }

最新更新