首页 > 语言 > PHP > 正文

php 3D饼图类绘制类函数

2024-09-04 11:44:24
字体:
来源:转载
供稿:网友

下面关于php 3D饼图类绘制类函数实现原理是根据//椭圆长半轴等参数绘制一个3D饼图形的代码,代码如下:

  1. class chart{ 
  2.  
  3. var $a//椭圆长半轴  
  4. var $b//椭圆短半轴  
  5. var $DataArray;  //每个扇形的数据  
  6. var $ColorArray//每个扇形的颜色 要求按照十六进制书写但前面不加0x  
  7. //为边缘及阴影为黑色 
  8.  
  9. function chart($pa=100,$pb=60,$sData="100,200,300,400,500,300"$sColor="ee00ff,dd0000,cccccc,ccff00,00ccff,ccff00")  
  10. {  
  11.     $this->a=$pa;  
  12.     $this->b=$pb;  
  13.     $this->DataArray=split(",",$sData);  
  14.     $this->ColorArray=split(",",$sColor);  
  15.  
  16. function setA($v){  
  17.     $this->a=$v;  
  18.  
  19. function getA(){  
  20.     return $this->a;  
  21.  
  22. function setB($v){  
  23.     $this->b=$v;   
  24.  
  25. function getB(){  
  26.     return $this->b;  
  27.  
  28. function setDataArray($v){  
  29.     $this->DataArray=split(",",$v);  
  30.  
  31. function getDataArray($v){  
  32.     return $this->DataArray;  
  33.  
  34. function setColorArray($v){  
  35.     $this->ColorArray=split(",",$v);  
  36.  
  37. function getColorArray(){  
  38.     return  $this->ColorArray;  
  39.  
  40.    
  41. function  DrawPie(){  
  42.     $image=imagecreate($this->a*2+40,$this->b*2+40);  
  43.     $PieCenterX=$this->a+10;  
  44.     $PieCenterY=$this->b+10;  
  45.     $DoubleA=$this->a*2;  
  46.     $DoubleB=$this->b*2;  
  47.     list($R,$G,$B)=getRGB(0);  
  48.     $colorBorder=imagecolorallocate($image,$R,$G,$B);  
  49.     $DataNumber=count($this->DataArray);  
  50.       
  51.     //$DataTotal  
  52.     for($i=0;$i<$DataNumber;$i++)      $DataTotal+=$this->DataArray[$i]; //算出数据和  
  53.       
  54.     //填充背境  
  55.     imagefill($image, 0, 0, imagecolorallocate($image, 0xFF, 0xFF, 0xFF)); 
  56.  
  57.     /*  
  58.     ** 画每一个扇形  
  59.     */  
  60.     $Degrees = 0;  
  61.     for($i = 0; $i < $DataNumber$i++){  
  62.         $StartDegrees = round($Degrees);  
  63.         $Degrees += (($this->DataArray[$i]/$DataTotal)*360);  
  64.         $EndDegrees = round($Degrees);  
  65.         $percent = number_format($this->DataArray[$i]/$DataTotal*100, 1);   
  66.         list($R,$G,$B)=getRGB(hexdec($this->ColorArray[$i]));  
  67.         $CurrentColor=imagecolorallocate($image,$R,$G,$B);  
  68.         if ($R>60 and $R<256)            $R=$R-60;  
  69.         if ($G>60 and $G<256)            $G=$G-60;  
  70.         if ($B>60 and $B<256)            $B=$B-60;  
  71.         $CurrentDarkColor=imagecolorallocate($image,$R,$G,$B);  
  72.         //画扇形弧  
  73.         imagearc($image,$PieCenterX,$PieCenterY,$DoubleA,$DoubleB,$StartDegrees,$EndDegrees,$CurrentColor);  
  74.         //画直线  
  75.         list($ArcX$ArcY) = pie_point($StartDegrees , $this->a , $this->b);  
  76.         imageline($image,$PieCenterX,$PieCenterY,floor($PieCenterX + $ArcX),floor($PieCenterY + $ArcY),$CurrentColor);  
  77.         //画直线  
  78.         list($ArcX$ArcY) = pie_point($EndDegrees,$this->a , $this->b);  
  79.         imageline($image,$PieCenterX,$PieCenterY,ceil($PieCenterX + $ArcX),ceil($PieCenterY + $ArcY),$CurrentColor);  
  80.         //填充扇形  
  81.         $MidPoint = round((($EndDegrees - $StartDegrees)/2) + $StartDegrees);  
  82.         list($ArcX$ArcY) = Pie_point($MidPoint$this->a*3/4 , $this->b*3/4);  
  83.           
  84.         imagefilltoborder($image,floor($PieCenterX + $ArcX),floor($PieCenterY + $ArcY), $CurrentColor,$CurrentColor);  
  85.         imagestring($image,2,floor($PieCenterX + $ArcX-5),floor($PieCenterY + $ArcY-5),$percent."%",$colorBorder); 
  86.  
  87.         //画阴影  
  88.         if ($StartDegrees>=0 and $StartDegrees<=180){  
  89.            if($EndDegrees<=180){      
  90.                for($k = 1; $k < 15; $k++)  
  91.                 imagearc($image,$PieCenterX$PieCenterY+$k,$DoubleA$DoubleB$StartDegrees$EndDegrees$CurrentDarkColor);  
  92.            }else{  
  93.                for($k = 1; $k < 15; $k++)  
  94.                 imagearc($image,$PieCenterX$PieCenterY+$k,$DoubleA$DoubleB$StartDegrees, 180, $CurrentDarkColor);  
  95.            } 
  96.  
  97.         }  
  98.    }  
  99.           
  100.     /*到此脚本已经生了一幅图像了  
  101.     **现在需要的是把它发到浏览器上,重要的一点是要将标头发给浏览器,让它知道是一个GIF文件。不然的话你只能看到一堆奇怪的乱码  
  102.     */   
  103.     //输出生成的图片      
  104.     header("Content-type: image/gif");  
  105.     imagegif($image);  
  106.     imagedestroy($image);  
  107. }//End drawPie()  
  108. }//End class 
  109. //开源代码Vevb.com 
  110. //实现 
  111. $objp = new chart();  
  112. $objp->DrawPie(); 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表