drawPieImg()函数包含8个参数,$title为饼状图的标题;$dataArr为需要显示的数据数组;$labelArr为对应数据的标签分类数组;$colorArr为对应数据的绘图颜色数组,这4个参数是必须的,对于不同的系统应用传递相应的参数即可。接下来的4个参数,负责设置要生成的饼状图的大小,如果不设置则使用系统默认值。程序按照床底数组数据的大小,从0度开始绘制,方向按照顺时针方向依次绘制对应数据占据的扇面大小。 <div class="codetitle"><a style="CURSOR: pointer" data="91679" class="copybut" id="copybut91679" onclick="doCopy('code91679')"> 代码如下:<div class="codebody" id="code91679"> <?php //变量定义,画椭圆弧时的角度大小 define("ANGLELENGTH",3); / 绘制图片 @param $title3D图的标题 @param $dataArr显示的数据数组 @param $labelArr对应数据的标签分类数组 @param $colorArr对应绘图颜色的数组 @param $a画布的基准宽度 @param $b画布的基准高度 @param $v3D柱的高度 @param $font字体大小 @return 绘制成功的图片访问路径 / function drawPieImg($title,$dataArr,$labelArr,$colorArr,$a=250,$b=120,$v=20,$font=10){ $ox = 5+$a; $oy = 5+$b; $fw = imagefontwidth($font); $fh = imagefontheight($font); $n = count($dataArr);//计算数组长度 $w = 10+$a2; $h = 10+$b2+$v+($fh+2)$n; //创建画板 $img = imagecreate($w,$h); //转RGB为索引色 for($i=0; $i<$n; $i++) $colorArr[$i] = drawIndexColor($img,$colorArr[$i]);//为图像$img分配颜色 $clrbk = imagecolorallocate($img,0xff,0xff); $clrt = imagecolorallocate($img,0x00,0x00); //填充背景色 imagefill($img,$clrbk); //求和 $tot = 0; for($i=0; $i<$n; $i++) $tot += $dataArr[$i]; //每个分类的起始角度大小 $sd = 0; //每个分类所占据的角度大小 $ed = 0; $ly = 10+$b2+$v; for($i=0; $i<$n; $i++){ $sd = $ed; $ed += $dataArr[$i]/$tot360; //画3d扇面 draw3DSector($img,$ox,$oy+20,$a,$b,$v,$sd,$ed,$colorArr[$i]); //画标签 imagefilledrectangle($img,5,$ly,5+$fw,$ly+$fh,$colorArr[$i]); imagerectangle($img,$clrt); //中文转码 $str = iconv("GB2312","UTF-8",$labelArr[$i]); imagettftext($img,$font,5+2$fw,$ly+13,$clrt,"D:/wamp/www/source/font/simhei.ttf",$str.":".$dataArr[$i]."(".(round(10000($dataArr[$i]/$tot))/100)."%)"); $ly += $fh+2; } //绘制图片标题 imagettftext($img,15,iconv("GB2312",$title)); //输出图形 header("Content-type: image/png"); //输出生成的图片 $imgFileName = "./".time().".png"; imagepng($img,$imgFileName); return $imgFileName; } / 绘制3d扇面 / function draw3DSector($img,$oy,$clr) { drawSector($img,$clr); if($sd<180){ list($red,$green,$blue) = drawDarkColor($img,$clr); //为图像分配颜色 $clr=imagecolorallocate($img,$red,$blue); if($ed>180) $ed = 180; list($sx,$sy) = getExy($a,$sd); $sx += $ox; $sy += $oy; list($ex,$ey) = getExy($a,$ed); $ex += $ox; $ey += $oy; imageline($img,$sx,$sy,$sy+$v,$clr); imageline($img,$ex,$ey,$ey+$v,$clr); drawArc($img,$oy+$v,$clr); list($sx,($sd+$ed)/2); $sy += $oy+$v/2; $sx += $ox; imagefill($img,$clr); } } / 绘制椭圆弧 / function drawArc($img,$clr){ $n = ANGLELENGTH >0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1; $d = $sd; list($x0,$y0) = getExy($a,$d); for($i=0; $i<$n; $i++){ $d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH); list($x,$y) = getExy($a,$d); imageline($img,$x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr); $x0 = $x; $y0 = $y; } } / 绘制扇面 / function drawSector($img,$clr) { $n = ANGLELENGTH > 0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1; $d = $sd; list($x0,$clr); for($i=0; $i<$n; $i++) { $d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH); list($x,$clr); $x0 = $x; $y0 = $y; } imageline($img,$clr); list($x,$y) = getExy($a/2,$b/2,($d+$sd)/2); imagefill($img,$clr); } / 根据$clr颜色获取对应的柱的阴影色 @param $img图像 @param $clr颜色 @return rgb颜色数组 */ function drawDarkColor($img,$clr){ $rgb = imagecolorsforindex($img,$clr); return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2); } /* 求角度$d对应的椭圆上的点坐标 @param $a横坐标 @param $b纵坐标 @param $d角度 @return 对应椭圆点坐标 / function getExy($a,$d){ $d = deg2rad($d); return array(round($acos($d)),round($bsin($d))); } / 为图像分配RGB索引色 / function drawIndexColor($img,$clr){ $red = ($clr>>16) & 0xff; $green = ($clr>>8)& 0xff; $blue = ($clr) & 0xff; return imagecolorallocate($img,$blue); } //测试示例 $title = "动物园动物种类分布情况"; $dataArr = array(20,10,20,30,10); //测试数据数组 $labelArr = array("大象","长颈鹿","鳄鱼","鸵鸟","老虎","狮子","猴子","斑马");//标签 $colorArr = array(0x99ff00,0xff6666,0x0099ff,0xff99ff,0xffff99,0x99ffff,0xff3333,0x009999); //对应颜色数组 $result = drawPieImg($title,$colorArr); echo "<img src=".$result." mce_src=".$result.">"; ?>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|