繁体   English   中英

使用PHP根据变量数设置颜色阴影

[英]Set color shade based on variable number with 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>";
}

某些语言具有“线性”功能-线性插值。 非常有用。 我的建议:

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]})"; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM