這個函式的用途是將以 HSV 表示的顏色轉換成 RGB 色碼,演算法來自 Wikipedia ,目前網站的隨日期變色效果就是用此 function 來達成的。
$H 的範圍為 0–360 , $S 的範圍為 0–100 , $V 的範圍為 0–100
function hsv2rgb($H, $S, $V)
{
if ( $V == 0 )
{
$R = 0;
$G = 0;
$B = 0;
}
else if ( $S == 0 )
{
$V = $V / 100;
$R = $V * 255;
$G = $V * 255;
$B = $V * 255;
}
else
{
//這一段是讓 $H 也能輸入小於 0 或大於 360 的數字,這樣用起來比較方便
if ( $H > 360 )
{
$H = $H % 360;
}
else if ( $H < 0 )
{
$H = 360 + ( $H % 360 );
}
$S = $S / 100;
$V = $V / 100;
$Hf = $H / 60;
$Hi = floor( $Hf );
$f = $Hf - $Hi;
$p = $V * ( 1 - $S );
$q = $V * ( 1 - $S * $f );
$t = $V * ( 1 - $S * ( 1 - $f ) );
switch ( $Hi ) {
case 0:
$R = $V * 255;
$G = $t * 255;
$B = $p * 255;
break;
case 1:
$R = $q * 255;
$G = $V * 255;
$B = $p * 255;
break;
case 2:
$R = $p * 255;
$G = $V * 255;
$B = $t * 255;
break;
case 3:
$R = $p * 255;
$G = $q * 255;
$B = $V * 255;
break;
case 4:
$R = $t * 255;
$G = $p * 255;
$B = $V * 255;
break;
case 5:
$R = $V * 255;
$G = $p * 255;
$B = $q * 255;
break;
}
}
return '#' . str_pad(dechex(round($R)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($G)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($B)), 2, "0", STR_PAD_LEFT);
}