php 三维饼图的实现代码

 更新时间:2008年09月28日 14:36:47   作者:  
一直想发表点东西。最近刚把php4中的php_gd.dll搞定,就迫不及待的想做点图形程序玩玩。看到有许多php做饼图的例子,看了一下都是2维的,于是就想做个3维的。
经过努力pie3d完成了,好东西与大家分享。不过小弟是php新手,代码可能不够精炼,希望大家指教共同来完善这个程序。记得通知我(estorm@yeah.net)
+------------------------+
| pie3dfun.php//公用函数 |
+------------------------+
define("ANGLE_STEP",5);//定义画椭圆弧时的角度步长
function chx_getdarkcolor($img,$clr){//求$clr对应的暗色
$rgb=imagecolorsforindex($img,$clr);
return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}
function chx_getexy($a,$b,$d){//求角度$d对应的椭圆上的点坐标
$d=deg2rad($d);
return array(round($a*Cos($d)),round($b*Sin($d)));
}
function chx_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//椭圆弧函数
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
list($x0,$y0)=chx_getexy($a,$b,$d);
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;
}
}
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);
}
function chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clr){//3d扇面
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);
}
}
function chx_getindexcolor($img,$clr){//RBG转索引色
$R=($clr>>16) & 0xff;
$G=($clr>>8)& 0xff;
$B=($clr) & 0xff;
return imagecolorallocate($img,$R,$G,$B);
}
?>
+--------------------------+
| pie3d.php //三维饼图文件 |
+--------------------------+
require("pie3dfun.php");
$a=150;//椭圆长半轴
$b=50;//椭圆段半轴
$v=20;//圆饼高度
$font=5;//字体
$ox=5+$a;
$oy=5+$b;
$fw=imagefontwidth($font);
$fh=imagefontheight($font);

$datLst=array(30,10,20,20,10,20,10,20);//数据
$labLst=array("a1","a2","a3","a4","a5","a6","a7","a8");//标签
$clrLst=array(0x99ff00,0xff6666,0x0099ff,0xff99ff,0xffff99,0x99ffff,0xff3333,0x009999);
$w=10+$a*2;
$h=10+$b*2+$v+($fh+2)*count($datLst);
$img=imagecreate($w,$h);
//转RGB为索引色
for($i=0;$i
$clrbk=imagecolorallocate($img,0xff,0xff,0xff);
$clrt=imagecolorallocate($img,0x00,0x00,0x00);
//填充背景色
imagefill($img,0,0,$clrbk);
//求和
$tot=0;
for($i=0;$i
$sd=0;
$ed=0;
$ly=10+$b*2+$v;
for($i=0;$i $sd=$ed;
$ed+=$datLst[$i]/$tot*360;
//画圆饼
chx_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);
$ly+=$fh+2;
}
//输出图形
header("Content-type:image/gif");
imagegif($img);
?>

相关文章

  • php获取访问者浏览页面的浏览器类型

    php获取访问者浏览页面的浏览器类型

    最近做的项目需要根据用户浏览器的类型而做一些不同的处理,于是稍微研究了一下使用php判断浏览器类型的方法,下面这篇文章主要给大家介绍了php如何获取访问者浏览页面的浏览器类型,需要的朋友可以参考借鉴,一起来看看吧。
    2017-01-01
  • Laravel-添加后台模板AdminLte的实现方法

    Laravel-添加后台模板AdminLte的实现方法

    今天小编就为大家分享一篇Laravel-添加后台模板AdminLte的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • ThinkPHP3.1之D方法实例详解

    ThinkPHP3.1之D方法实例详解

    这篇文章主要介绍了ThinkPHP3.1之D方法的使用,需要的朋友可以参考下
    2014-06-06
  • laravel 使用事件系统统计浏览量的实现

    laravel 使用事件系统统计浏览量的实现

    今天小编就为大家分享一篇laravel 使用事件系统统计浏览量的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • 详解PHP中的null合并运算符

    详解PHP中的null合并运算符

    这篇文章主要介绍了PHP中的null合并运算符的相关资料,需要的朋友可以参考下
    2015-12-12
  • php7 安装yar 生成docker镜像

    php7 安装yar 生成docker镜像

    这篇文章主要介绍了php7 安装yar 生成docker镜像,需要的朋友可以参考下
    2017-05-05
  • Yii2创建控制器(createController)方法详解

    Yii2创建控制器(createController)方法详解

    这篇文章主要介绍了Yii2创建控制器(createController)的方法,结合实例形式分析了Yii创建控制器所使用到的方法、操作步骤与相关技巧,需要的朋友可以参考下
    2016-07-07
  • php+ajax实现异步上传文件或图片功能

    php+ajax实现异步上传文件或图片功能

    这篇文章主要为大家详细介绍了php+ajax实现异步上传文件或图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 利用php+mysql来做一个功能强大的在线计算器

    利用php+mysql来做一个功能强大的在线计算器

    有天在努力的搜索计算器,发现都是JavaScript,而且要一个个地点击,并且不能记录,输入计算式子时容易出错,于是就想了想该怎样才能让它好用点呢,能够用键盘直接输入。
    2010-10-10
  • Yii入门教程之Yii安装及hello world

    Yii入门教程之Yii安装及hello world

    本文介绍了在windows环境下Yii的安装过程以及第一个"hello world"的诞生过程,图文并茂,非常的详尽,有需要的小伙伴参考下。
    2014-11-11

最新评论