这是一个画3D扇面的函数.
function chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clr)

chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr); 
if($sd<180)

list($R,$G,$B)=chx_getdarkcolor($img,$clr); 
$clr=imagecolorallocate($img,$R,$G,$B); 
if($ed>180) $ed=180; 
list($sx,$sy)=chx_getexy($a,$b,$sd); 
$sx+=$ox; 
$sy+=$oy; 
list($ex,$ey)=chx_getexy($a,$b,$ed); 
$ex+=$ox; 
$ey+=$oy; 
imageline($img,$sx,$sy,$sx,$sy+$v,$clr); 
imageline($img,$ex,$ey,$ex,$ey+$v,$clr); 
chx_arc($img,$ox,$oy+$v,$a,$b,$sd,$ed,$clr); 
list($sx,$sy)=chx_getexy($a,$b,($sd+$ed)/2); 
$sy+=$oy+$v/2; 
$sx+=$ox; 
imagefill($img,$sx,$sy,$clr); 

}

解决方案 »

  1.   

    这是画平面扇面的函数
    function chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr)

    $n=ceil(($ed-$sd)/ANGLE_STEP); 
    $d=$sd; 
    list($x0,$y0)=chx_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)=chx_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)=chx_getexy($a/2,$b/2,($d+$sd)/2); 
    imagefill($img,$x+$ox,$y+$oy,$clr); 
    }
      

  2.   

    <?
    /**
      函数 Bar3d 用于绘制3三维条形图
      使用世界坐标系,即原点在左下角。函数中做了WC-DC的转换
    */
    function getRGB($color){  
      $R=($color>>16) & 0xff;  
      $G=($color>>8) & 0xff;  
      $B=($color) & 0xff;  
      return (array($R,$G,$B));  
    }  
    function setColor(&$im,$color) {
      list($R,$G,$B) = getRGB($color);
      return imagecolorallocate($im,$R,$G,$B);
    }
    function Bar3d(&$image,$x,$y,$w,$h,$z,$color=0xffffff,$angle=45) {
      $dw = ceil($z*sin(deg2rad($angle)));
      $dh = ceil($z*cos(deg2rad($angle)));
      $im = imagecreate($w+abs($dw),$h+abs($dh));
      $mx = imagesx($im);
      $my = imagesy($im);
      list($R,$G,$B) = getRGB($color);
      $bg = imagecolorallocate($im,256-$R,256-$G,256-$B);
      imagecolortransparent($im,$bg);
      $a = array(0,$my,   $w,$my,   $w+$dw,$my-$dh,   $dw,$my-$dh);
      for($i=0;$i<8;$i+=2) {
        $b[] = $a[$i];
        $b[] = $a[$i+1]-$h;
      }
      if($dw < 0)
        for($i=0;$i<8;$i+=2) {
          $a[$i] -= $dw;
          $b[$i] -= $dw;
        }
      if($dh < 0)
        for($i=1;$i<8;$i+=2) {
          $a[$i] += $dh;
          $b[$i] += $dh;
        }
      $k = 0.8;
      if($dh > 0)
        imagefilledPolygon($im,$b,4,imagecolorallocate($im,$R*$k,$G*$k,$B*$k));
      else
        imagefilledPolygon($im,$a,4,imagecolorallocate($im,$R*$k,$G*$k,$B*$k));
      if($dw > 0)
        imagefilledPolygon($im,array($a[2],$a[3],$b[2],$b[3],$b[4],$b[5],$a[4],$a[5]),4,imagecolorallocate($im,$R/2,$G/2,$B/2));
      else
        imagefilledPolygon($im,array($a[6],$a[7],$b[6],$b[7],$b[0],$b[1],$a[0],$a[1]),4,imagecolorallocate($im,$R/2,$G/2,$B/2));
      imagefilledPolygon($im,array($a[0],$a[1],$b[0],$b[1],$b[2],$b[3],$a[2],$a[3]),4,imagecolorallocate($im,$R,$G,$B));
      imagecopyresized($image,$im,$x,imagesy($image)-$y-$my,0,0,$mx,$my,$mx,$my);
      return $image;
    }/*** 测试例 ***/
    $im = imagecreate(200,200);
    setColor($im,0xefefef);$color = array(0xff0000,0x00ff00,0x0000ff,0xffff00);
    $data = array(
      array(40,30,75,40),
      array(20,40,30,10),
      array(10,20,30,20)
    );foreach($data as $v) {
      $m[] = max($v);
      $cell[] = count($v);
    }
    $m = max($m);
    $cell = max($cell);
    $x = 10;
    $y = 10;
    $z = 10;
    $kx = floor(floor((imagesx($im)-3*$x)/count($data))/$cell);
    $ky = (imagesy($im)-3*$y)/$m;foreach($data as $v) {
      foreach($v as $i=>$d) {
        Bar3d($im,$x,$y,$kx,$d*$ky,$z,$color[$i]);
        $x += $kx;
      }
      $x = ceil($x+4);
    }header("Content-type: image/gif");  
    imagepng($im);  
    imagedestroy($im);
    ?>