一江春水向東流

          做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

            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 閱讀(209) 評論(0)  編輯  收藏 所屬分類: PHP+MySQL開發
          主站蜘蛛池模板: 台中市| 临沧市| 邵东县| 顺昌县| 托里县| 武宣县| 明星| 长兴县| 于都县| 新化县| 洱源县| 玉龙| 宁波市| 通山县| 瓦房店市| 江山市| 喀喇沁旗| 延寿县| 鹤岗市| 新乐市| 江达县| 奉节县| 朔州市| 邯郸县| 尼木县| 澄迈县| 大石桥市| 灵台县| 靖宇县| 兴山县| 新疆| 罗江县| 米脂县| 湟源县| 大连市| 德清县| 霞浦县| 黄骅市| 内乡县| 静安区| 庆元县|