一江春水向东流

做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  44 随笔 :: 139 文章 :: 81 评论 :: 0 Trackbacks
// 图形类->gd.class.php
<? php

class  GD{
 
/*  
函数说明 
$data:y轴数据(数组) 
$graphdata:y轴数据--百分比(数组) 
$label:x轴数据(数组) 
$height:图像高度 
$width:图像宽度 
$font:字号 
$dot:决定点的大小 
$bg:背景色 
$line :线色 
$text :文本色 
$dotcolor:点色 
$file:输出图像文件名 
*/  
// 线形图的函数
function  qximage( $data   ,   $graphdata ,   $label   ,   $height ,   $width   ,   $font ,   $dot ,  

$bg ,   $line ,   $text ,   $dotcolor ,   $file

$jc = $height / 100
$fontwidth =  imagefontwidth ( $font ); 
$fontheight = imagefontheight( $font ); 

$image =  imagecreate ( $width , $height + 20 ); 
$bg =  imagecolorallocate( $image   , $bg [ 0 ] , $bg [ 1 ] , $bg [ 2 ]); 
$line = imagecolorallocate( $image   , $line [ 0 ] , $line [ 1 ] , $line [ 2 ]); 
$text = imagecolorallocate( $image   , $text [ 0 ] , $text [ 1 ] , $text [ 2 ]); 
$dotcolor = imagecolorallocate( $image   , $dotcolor [ 0 ] , $dotcolor [ 1 ] , $ $dotcolor [ 2 ]); 
imageline (
$image , 0 , 0 , 0 , $height , $line ); 
imageline(
$image , 0 , $height , $width , $height , $line ); 
for  ( $i = 1 ; $i < 11 ; $i ++

 imagedashedline(
$image , 0 , $height   -   $jc * $i * 10   , $width   , $height   - $jc * $i * 10  

, $line  ); 
 imagestring (
$image , $font , 0 , $height - $jc * $i * 10 , $i * 10 , $text ); 

for  ( $i = 0 ; $i  { 
 
# echo $tmp." "; 
  $x1 = (( $width - 50 ) / count ( $data )) * ( $i ) + 40
 
# echo $x1 ." "; 
  $y1 = $height - $graphdata [ $i ] * $jc
 
$x2 = $x1
 
$y2 = $y1 + $graphdata [ $i ] * $jc
 
# echo $y1." "; 
 imagestring( $image , $font , $x1 , $y1 - 2 * $fontheight , $graphdata [ $i ] . " %( " . $data

[
$i ] . " ) " , $text ); 
 imagearc (
$image , $x1   , $y1 , $dot , $dot , 0 , 360 , $dotcolor ); 
 imagefilltoborder (
$image , $x1 , $y1 , $dotcolor , $dotcolor ); 
 imagestring (
$image , $font , $x1 , $y2 , $label [ $i ] , $text ); 
 
if  ( $i > 0
 { 
  imageline(
$image , $tmpx1 , $tmpy1 , $x1 , $y1 , $line ); 
 } 
 
$tmpx1 = $x1 ; $tmpy1 = $y1

imagegif (
$image , $file ); 

// 为了方便起见,我又做了一个函数来制作柱型图
/*
参数说明:
$graphdata:百分比数据(y轴)
$label:x轴标题
$data:实际数据(y轴)
$graphwidth:图像宽度
$graphheight:图像高度
$graphscale:高度因子(为$graphheight/100)
$graphfont:字体号
$bg;背景颜色值
$text:文本颜色值
$grid:边线颜色值
$bar:柱的颜色值
$bz:备注(不支持中文呀)
*/
 
function  timage(
 
$graphdata , $label , $data ,
 
$graphwidth , $graphheight , $graphscale , $graphfont ,
 
$bg , $text , $grid , $bar , $bz )
 {

 
header ( " Content-type:image/gif " );
 
$image = imagecreate( $graphwidth + 50 , $graphheight + 50 );
 
$bgcolor =  imagecolorallocate ( $image   , $bg [ 0 ] , $bg [ 1 ] , $bg [ 2 ]);
 
$textcolor =  imagecolorallocate ( $image   , $text [ 0 ] , $text [ 1 ] , $text [ 2 ]);
 
$gridcolor = imagecolorallocate ( $image   , $grid [ 0 ] , $grid [ 1 ] , $grid [ 2 ]);
 
$barcolor = imagecolorallocate ( $image   , $bar [ 0 ] , $bar [ 1 ] , $bar [ 2 ]);
 
$gridabelwidth = imagefontwidth( $graphfont ) * 3 + 1 ;
 
$gridableheight =  imagefontheight ( $graphfont );
 imageline(
$image , $gridlabelwidth , 0 , $gridlabelwidth , $graphheight -

1 , $gridcolor );
 imageline(
$image , 0 , $graphheight - 1 , $graphwidth - 1 , $graphheight - 1 , $gridcolor );
 
for ( $i = 0 ; $i < $graphheight ; $i += $graphheight / 10 )
 {
  imagedashedline (
$image , 0 , $i , $graphwidth - 1 , $i , $gridcolor );
  imagestring(
$image , $graphfont , 0 , $i , round (( $graphheight - $i ) /

$graphscale ) , $textcolor );
 }

 
$barwidth = (( $graphwidth - $gridlabelwidth ) / count ( $graphdata )) -

30 ; # &iquest;&Oslash;&Ouml;&AElig;&Ouml;ù&micro;&Auml;×

& Uuml; & iquest;í & para; & Egrave;
 
for ( $i = 0 ; $i  {
  
$bartopx = $gridlabelwidth + (( $i + 1 ) * 20 ) +

(
$i * $barwidth ); # &iquest;&Oslash;&Ouml;&AElig;&Ouml;ù&iquest;&iquest;×

ó
& micro; & Auml; & frac34;à & Agrave; & euml;
  
$barbottomx = $bartopx + $barwidth ;   $barbottomy = $graphheight -

1 ; # &iquest;&Oslash;&Ouml;&AElig;&Ouml;ù&micro;&Auml;&Iuml;&Acirc;±

& szlig; & frac12; & ccedil;
  
$bartopy = $barbottomy - ( $graphdata [ $i ] * $graphscale );
  imagefilledrectangle

(
$image , $bartopx , $bartopy , $barbottomx , $barbottomy , $barcolor );
  
$labelx1 = $bartopx ;
  
$labely1 = $bartopy - 15 ;
  
$labelx2 = $bartopx ;
  
$labely2 = $graphheight ;
  imagestring(
$image , $graphfont , $labelx1 , $labely1 , " $graphdata

[$i]
" . " % " , $textcolor );
  imagestring(
$image , $graphfont , $labelx2 , $labely2 , " $label[$i] " , $textcolor );
  imagestringup (
$image , $graphfont , $labelx1 + 10 , $labely1 -

$gridableheight , " $data[$i] " , $textcolor );
 }
 imagestring(
$image , $graphfont , 1 , $graphheight + 30 , $bz , $textcolor );
 imagegif (
$image );
 }

// PHP数据饼图
  define ( " ANGLE_STEP " ,   5 );     // 定义画椭圆弧时的角度步长 

function  draw_getdarkcolor( $img , $clr )     // 求$clr对应的暗色 

    
$rgb      =     imagecolorsforindex( $img , $clr ); 
    
return   array ( $rgb [ " red " ] / 2 , $rgb [ " green " ] / 2 , $rgb [ " blue " ] / 2 ); 


function  draw_getexy( $a ,   $b ,   $d )     // 求角度$d对应的椭圆上的点坐标 

    
$d          =      deg2rad ( $d ); 
    
return   array ( round ( $a * Cos ( $d )) ,   round ( $b * Sin ( $d ))); 


function  draw_arc( $img , $ox , $oy , $a , $b , $sd , $ed , $clr )     // 椭圆弧函数 

    
$n                      =      ceil (( $ed - $sd ) / ANGLE_STEP); 
    
$d                      =      $sd
    
list ( $x0 , $y0 )         =     draw_getexy( $a , $b , $d ); 
    
for ( $i = 0 $i < $n $i ++


        
$d                  =     ( $d + ANGLE_STEP) > $ed ? $ed : ( $d + ANGLE_STEP); 
        
list ( $x ,   $y )     =     draw_getexy( $a ,   $b ,   $d ); 
        imageline(
$img ,   $x0 + $ox ,   $y0 + $oy ,   $x + $ox ,   $y + $oy ,   $clr ); 
        
$x0                  =      $x
        
$y0                  =      $y
    } 


function  draw_sector( $img ,   $ox ,   $oy ,   $a ,   $b ,   $sd ,   $ed ,   $clr )     // 画扇面 

    
$n                      =      ceil (( $ed - $sd ) / ANGLE_STEP); 
    
$d                      =      $sd
    
list ( $x0 , $y0 )         =     draw_getexy( $a ,   $b ,   $d ); 
    imageline(
$img ,   $x0 + $ox ,   $y0 + $oy ,   $ox ,   $oy ,   $clr ); 
    
for ( $i = 0 $i < $n $i ++
    { 
        
$d                  =     ( $d + ANGLE_STEP) > $ed ? $ed : ( $d + ANGLE_STEP); 
        
list ( $x ,   $y )     =     draw_getexy( $a ,   $b ,   $d ); 
        imageline(
$img ,   $x0 + $ox ,   $y0 + $oy ,   $x + $ox ,   $y + $oy ,   $clr ); 
        
$x0                  =      $x
        
$y0                  =      $y
    } 
    imageline(
$img ,   $x0 + $ox ,   $y0 + $oy ,   $ox ,   $oy ,   $clr ); 
    
list ( $x ,   $y )         =     draw_getexy( $a / 2 ,   $b / 2 ,  ( $d + $sd ) / 2 ); 
    imagefill(
$img ,   $x + $ox ,   $y + $oy ,   $clr ); 


function  draw_sector3d( $img ,   $ox ,   $oy ,   $a ,   $b ,   $v ,   $sd ,   $ed ,   $clr )     // 3d扇面 

    draw_sector(
$img ,   $ox ,   $oy ,   $a ,   $b ,   $sd ,   $ed ,   $clr ); 
    
if ( $sd < 180
    { 
        
list ( $R ,   $G ,   $B )     =     draw_getdarkcolor( $img ,   $clr ); 
        
$clr = imagecolorallocate( $img ,   $R ,   $G ,   $B ); 
        
if ( $ed > 180 $ed          =      180
        
list ( $sx ,   $sy )         =     draw_getexy( $a , $b , $sd ); 
        
$sx                      +=      $ox
        
$sy                      +=      $oy
        
list ( $ex ,   $ey )         =     draw_getexy( $a ,   $b ,   $ed ); 
        
$ex                      +=      $ox
        
$ey                      +=      $oy
        imageline(
$img ,   $sx ,   $sy ,   $sx ,   $sy + $v ,   $clr ); 
        imageline(
$img ,   $ex ,   $ey ,   $ex ,   $ey + $v ,   $clr ); 
        draw_arc(
$img ,   $ox ,   $oy + $v ,   $a ,   $b ,   $sd ,   $ed ,   $clr ); 
        
list ( $sx ,   $sy )         =     draw_getexy( $a ,   $b ,  ( $sd + $ed ) / 2 ); 
        
$sy                      +=      $oy + $v / 2
        
$sx                      +=      $ox
        imagefill(
$img ,   $sx ,   $sy ,   $clr ); 
    } 


function  draw_getindexcolor( $img ,   $clr )     // RBG转索引色 

    
$R          =     ( $clr >> 16 &   0xff
    
$G          =     ( $clr >> 8 ) &   0xff
    
$B          =     ( $clr &   0xff
    
return  imagecolorallocate( $img ,   $R ,   $G ,   $B ); 


//  绘图主函数,并输出图片 
// $datLst 为数据数组, $datLst 为标签数组, $datLst 为颜色数组 
// 以上三个数组的维数应该相等 

function  draw_img( $datLst , $labLst , $clrLst , $a = 250 , $b = 120 , $v = 20 , $font = 10

    
$ox          =      5 + $a
    
$oy          =      5 + $b
    
$fw          =     imagefontwidth( $font ); 
    
$fh          =     imagefontheight( $font ); 

    
$n          =      count ( $datLst ); // 数据项个数 

    
$w          =      10 + $a * 2
    
$h          =      10 + $b * 2 + $v + ( $fh + 2 ) * $n

    
$img      =     imagecreate( $w ,   $h ); 

    
// 转RGB为索引色 
     for ( $i = 0 $i < $n $i ++
        
$clrLst [ $i ]     =     draw_getindexcolor( $img , $clrLst [ $i ]); 

    
$clrbk      =     imagecolorallocate( $img ,   0xff ,   0xff ,   0xff ); 
    
$clrt      =     imagecolorallocate( $img ,   0x00 ,   0x00 ,   0x00 ); 

    
// 填充背景色 
    imagefill( $img ,   0 ,   0 ,   $clrbk ); 

    
// 求和 
     $tot      =      0
    
for ( $i = 0 $i < $n $i ++
        
$tot      +=      $datLst [ $i ]; 

$sd          =      0
    
$ed          =      0 333
    
$ly          =      10 + $b * 2 + $v
    
for ( $i = 0 $i < $n $i ++
    { 
        
$sd      =      $ed
        
$ed      +=      $datLst [ $i ] / $tot * 360

        
// 画圆饼 
        draw_sector3d( $img ,   $ox ,   $oy ,   $a ,   $b ,   $v ,   $sd ,   $ed ,   $clrLst [ $i ]);    

// $sd,$ed,$clrLst[$i]); 

        //画标签 

        imagefilledrectangle( $img ,   5 ,   $ly ,   5 + $fw ,   $ly + $fh ,   $clrLst [ $i ]); 
        imagerectangle(
$img ,   5 ,   $ly ,   5 + $fw ,   $ly + $fh ,   $clrt ); 
        
// imagestring($img, $font, 5+2*$fw, $ly, $labLst[$i].":".$datLst

[
$i ] . " ( " . ( round ( 10000 * ( $datLst [ $i ] / $tot )) / 100 ) . " %) " ,   $clrt ); 

        
$str      =      iconv ( " GB2312 " ,   " UTF-8 " ,   $labLst [ $i ]); 
        ImageTTFText(
$img ,   $font ,   0 ,   5 + 2 * $fw ,   $ly + 13 ,   $clrt ,   " ./simsun.ttf " ,  

$str . " : " . $datLst [ $i ] . " ( " . ( round ( 10000 * ( $datLst [ $i ] / $tot )) / 100 ) . " %) " ); 
        
$ly          +=      $fh + 2
    } 

    
// 输出图形 
     header ( " Content-type: image/png " ); 

    
// 输出生成的图片 
     $imgFileName   =   " ../temp/ " . time () . " .png "
    imagepng(
$img , $imgFileName ); 
    
echo   ' <IMG SRC=" ' . $imgFileName . ' " BORDER="1" ALT="统计饼图"> '


$datLst      =      array ( 30 ,   10 ,   20 ,   20 ,   10 ,   20 ,   10 ,   20 );     // 数据 
$labLst      =      array ( " 中国科技大学 " ,   " 安徽理工大学 " ,   " 清华大学 " ,   " 北京大学 " ,  

" 南京大学 " ,   " 上海大学 " ,   " 河海大学 " ,   " 中山大学 " );     // 标签 
$clrLst      =      array ( 0x99ff00 ,   0xff6666 ,   0x0099ff ,   0xff99ff ,   0xffff99 ,  

0x99ffff ,   0xff3333 ,   0x009999 ); 

// 画图 
draw_img( $datLst , $labLst , $clrLst ); 
?>  


//图形类->gd.class.php
<?php

class GD{
 /*
函数说明
$data:y轴数据(数组)
$graphdata:y轴数据--百分比(数组)
$label:x轴数据(数组)
$height:图像高度
$width:图像宽度
$font:字号
$dot:决定点的大小
$bg:背景色
$line :线色
$text :文本色
$dotcolor:点色
$file:输出图像文件名
*/
//线形图的函数
function qximage($data , $graphdata, $label , $height, $width , $font, $dot,

$bg, $line, $text, $dotcolor, $file)
{
$jc=$height/100;
$fontwidth= imagefontwidth ($font);
$fontheight=imagefontheight($font);

$image= imagecreate ($width,$height+20);
$bg= imagecolorallocate($image ,$bg[0],$bg[1],$bg[2]);
$line=imagecolorallocate($image ,$line[0],$line[1],$line[2]);
$text=imagecolorallocate($image ,$text[0],$text[1],$text[2]);
$dotcolor=imagecolorallocate($image ,$dotcolor[0],$dotcolor[1],$$dotcolor[2]);
imageline ($image,0,0,0,$height,$line);
imageline($image,0,$height,$width,$height,$line);
for ($i=1;$i<11;$i++)
{
 imagedashedline($image,0,$height - $jc*$i*10 ,$width ,$height -$jc*$i*10

,$line );
 imagestring ($image,$font,0,$height-$jc*$i*10,$i*10,$text);
}
for ($i=0;$i {
 #echo $tmp." ";
 $x1=(($width-50)/count($data))*($i)+40;
 #echo $x1 ." ";
 $y1=$height-$graphdata[$i]*$jc;
 $x2=$x1;
 $y2=$y1+$graphdata[$i]*$jc;
 #echo $y1." ";
 imagestring($image,$font,$x1,$y1-2*$fontheight,$graphdata[$i]."%(".$data

[$i].")",$text);
 imagearc ($image,$x1 ,$y1,$dot,$dot,0,360,$dotcolor);
 imagefilltoborder ($image,$x1,$y1,$dotcolor,$dotcolor);
 imagestring ($image,$font,$x1,$y2,$label[$i],$text);
 if ($i>0)
 {
  imageline($image,$tmpx1,$tmpy1,$x1,$y1,$line);
 }
 $tmpx1=$x1;$tmpy1=$y1;
}
imagegif ($image,$file);
}
//为了方便起见,我又做了一个函数来制作柱型图
/*参数说明:
$graphdata:百分比数据(y轴)
$label:x轴标题
$data:实际数据(y轴)
$graphwidth:图像宽度
$graphheight:图像高度
$graphscale:高度因子(为$graphheight/100)
$graphfont:字体号
$bg;背景颜色值
$text:文本颜色值
$grid:边线颜色值
$bar:柱的颜色值
$bz:备注(不支持中文呀)
*/
 function timage(
 $graphdata,$label,$data,
 $graphwidth,$graphheight,$graphscale,$graphfont,
 $bg,$text,$grid,$bar,$bz)
 {

 header("Content-type:image/gif");
 $image=imagecreate($graphwidth+50,$graphheight+50);
 $bgcolor= imagecolorallocate ($image ,$bg[0],$bg[1],$bg[2]);
 $textcolor= imagecolorallocate ($image ,$text[0],$text[1],$text[2]);
 $gridcolor=imagecolorallocate ($image ,$grid[0],$grid[1],$grid[2]);
 $barcolor=imagecolorallocate ($image ,$bar[0],$bar[1],$bar[2]);
 $gridabelwidth=imagefontwidth($graphfont)*3+1;
 $gridableheight= imagefontheight ($graphfont);
 imageline($image,$gridlabelwidth,0,$gridlabelwidth,$graphheight-

1,$gridcolor);
 imageline($image,0,$graphheight-1,$graphwidth-1,$graphheight-1,$gridcolor);
 for($i=0;$i<$graphheight;$i+=$graphheight/10)
 {
  imagedashedline ($image,0,$i,$graphwidth-1,$i,$gridcolor);
  imagestring($image,$graphfont,0,$i,round(($graphheight-$i)/

$graphscale),$textcolor);
 }

 $barwidth=(($graphwidth-$gridlabelwidth)/count($graphdata))-

30;#&iquest;&Oslash;&Ouml;&AElig;&Ouml;ù&micro;&Auml;×

&Uuml;&iquest;í&para;&Egrave;
 for($i=0;$i {
  $bartopx=$gridlabelwidth+(($i+1)*20)+

($i*$barwidth);#&iquest;&Oslash;&Ouml;&AElig;&Ouml;ù&iquest;&iquest;×

ó&micro;&Auml;&frac34;à&Agrave;&euml;
  $barbottomx=$bartopx+$barwidth;  $barbottomy=$graphheight-

1;#&iquest;&Oslash;&Ouml;&AElig;&Ouml;ù&micro;&Auml;&Iuml;&Acirc;±

&szlig;&frac12;&ccedil;
  $bartopy=$barbottomy-($graphdata[$i]*$graphscale);
  imagefilledrectangle

($image,$bartopx,$bartopy,$barbottomx,$barbottomy,$barcolor);
  $labelx1=$bartopx;
  $labely1=$bartopy-15;
  $labelx2=$bartopx;
  $labely2=$graphheight;
  imagestring($image,$graphfont,$labelx1,$labely1,"$graphdata

[$i]"."%",$textcolor);
  imagestring($image,$graphfont,$labelx2,$labely2,"$label[$i]",$textcolor);
  imagestringup ($image,$graphfont,$labelx1+10,$labely1-

$gridableheight,"$data[$i]",$textcolor);
 }
 imagestring($image,$graphfont,1,$graphheight+30,$bz,$textcolor);
 imagegif ($image);
 }

//PHP数据饼图
 define("ANGLE_STEP", 5);    //定义画椭圆弧时的角度步长

function draw_getdarkcolor($img,$clr)    //求$clr对应的暗色
{
    $rgb    =    imagecolorsforindex($img,$clr);
    return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}

function draw_getexy($a, $b, $d)    //求角度$d对应的椭圆上的点坐标
{
    $d        =    deg2rad($d);
    return array(round($a*Cos($d)), round($b*Sin($d)));
}

function draw_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr)    //椭圆弧函数
{
    $n                    =    ceil(($ed-$sd)/ANGLE_STEP);
    $d                    =    $sd;
    list($x0,$y0)        =    draw_getexy($a,$b,$d);
    for($i=0; $i<$n; $i++)

{
        $d                =    ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
        list($x, $y)    =    draw_getexy($a, $b, $d);
        imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
        $x0                =    $x;
        $y0                =    $y;
    }
}

function draw_sector($img, $ox, $oy, $a, $b, $sd, $ed, $clr)    //画扇面
{
    $n                    =    ceil(($ed-$sd)/ANGLE_STEP);
    $d                    =    $sd;
    list($x0,$y0)        =    draw_getexy($a, $b, $d);
    imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr);
    for($i=0; $i<$n; $i++)
    {
        $d                =    ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
        list($x, $y)    =    draw_getexy($a, $b, $d);
        imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
        $x0                =    $x;
        $y0                =    $y;
    }
    imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr);
    list($x, $y)        =    draw_getexy($a/2, $b/2, ($d+$sd)/2);
    imagefill($img, $x+$ox, $y+$oy, $clr);
}

function draw_sector3d($img, $ox, $oy, $a, $b, $v, $sd, $ed, $clr)    //3d扇面
{
    draw_sector($img, $ox, $oy, $a, $b, $sd, $ed, $clr);
    if($sd<180)
    {
        list($R, $G, $B)    =    draw_getdarkcolor($img, $clr);
        $clr=imagecolorallocate($img, $R, $G, $B);
        if($ed>180) $ed        =    180;
        list($sx, $sy)        =    draw_getexy($a,$b,$sd);
        $sx                    +=    $ox;
        $sy                    +=    $oy;
        list($ex, $ey)        =    draw_getexy($a, $b, $ed);
        $ex                    +=    $ox;
        $ey                    +=    $oy;
        imageline($img, $sx, $sy, $sx, $sy+$v, $clr);
        imageline($img, $ex, $ey, $ex, $ey+$v, $clr);
        draw_arc($img, $ox, $oy+$v, $a, $b, $sd, $ed, $clr);
        list($sx, $sy)        =    draw_getexy($a, $b, ($sd+$ed)/2);
        $sy                    +=    $oy+$v/2;
        $sx                    +=    $ox;
        imagefill($img, $sx, $sy, $clr);
    }
}

function draw_getindexcolor($img, $clr)    //RBG转索引色
{
    $R        =    ($clr>>16) & 0xff;
    $G        =    ($clr>>8)& 0xff;
    $B        =    ($clr) & 0xff;
    return imagecolorallocate($img, $R, $G, $B);
}

// 绘图主函数,并输出图片
// $datLst 为数据数组, $datLst 为标签数组, $datLst 为颜色数组
// 以上三个数组的维数应该相等
function draw_img($datLst,$labLst,$clrLst,$a=250,$b=120,$v=20,$font=10)
{
    $ox        =    5+$a;
    $oy        =    5+$b;
    $fw        =    imagefontwidth($font);
    $fh        =    imagefontheight($font);

    $n        =    count($datLst);//数据项个数

    $w        =    10+$a*2;
    $h        =    10+$b*2+$v+($fh+2)*$n;

    $img    =    imagecreate($w, $h);

    //转RGB为索引色
    for($i=0; $i<$n; $i++)
        $clrLst[$i]    =    draw_getindexcolor($img,$clrLst[$i]);

    $clrbk    =    imagecolorallocate($img, 0xff, 0xff, 0xff);
    $clrt    =    imagecolorallocate($img, 0x00, 0x00, 0x00);

    //填充背景色
    imagefill($img, 0, 0, $clrbk);

    //求和
    $tot    =    0;
    for($i=0; $i<$n; $i++)
        $tot    +=    $datLst[$i];

$sd        =    0;
    $ed        =    0; 333
    $ly        =    10+$b*2+$v;
    for($i=0; $i<$n; $i++)
    {
        $sd    =    $ed;
        $ed    +=    $datLst[$i]/$tot*360;

        //画圆饼
        draw_sector3d($img, $ox, $oy, $a, $b, $v, $sd, $ed, $clrLst[$i]);   

//$sd,$ed,$clrLst[$i]);

        //画标签
        imagefilledrectangle($img, 5, $ly, 5+$fw, $ly+$fh, $clrLst[$i]);
        imagerectangle($img, 5, $ly, 5+$fw, $ly+$fh, $clrt);
        //imagestring($img, $font, 5+2*$fw, $ly, $labLst[$i].":".$datLst

[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)", $clrt);

        $str    =    iconv("GB2312", "UTF-8", $labLst[$i]);
        ImageTTFText($img, $font, 0, 5+2*$fw, $ly+13, $clrt, "./simsun.ttf",

$str.":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)");
        $ly        +=    $fh+2;
    }

    //输出图形
    header("Content-type: image/png");

    //输出生成的图片
    $imgFileName = "../temp/".time().".png";
    imagepng($img,$imgFileName);
    echo '<IMG SRC="'.$imgFileName.'" BORDER="1" ALT="统计饼图">';
}

$datLst    =    array(30, 10, 20, 20, 10, 20, 10, 20);    //数据
$labLst    =    array("中国科技大学", "安徽理工大学", "清华大学", "北京大学",

"南京大学", "上海大学", "河海大学", "中山大学");    //标签
$clrLst    =    array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99,

0x99ffff, 0xff3333, 0x009999);

//画图
draw_img($datLst,$labLst,$clrLst);
?>

posted on 2008-05-24 20:04 allic 阅读(195) 评论(0)  编辑  收藏 所属分类: PHP+MySQL开发

只有注册用户登录后才能发表评论。


网站导航: