php 三维饼图的实现代码


Posted in PHP onSeptember 28, 2008

经过努力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 不错的学习资料
Feb 06 PHP
php 数学运算验证码实现代码
Oct 11 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 PHP
php日志函数error_log用法实例分析
Sep 23 PHP
PHP unset函数原理及使用方法解析
Aug 14 PHP
PHP控制网页过期时间的代码
Sep 28 #PHP
PHP集成FCK的函数代码
Sep 27 #PHP
php横向重复区域显示二法
Sep 25 #PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 #PHP
PHP伪造referer实例代码
Sep 20 #PHP
PHP面向对象分析设计的经验原则
Sep 20 #PHP
php 301转向实现代码
Sep 18 #PHP
You might like
php a simple smtp class
2007/11/26 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
Laravel下生成验证码的类
2017/11/15 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
python服务器与android客户端socket通信实例
2014/11/12 Python
浅谈Python处理PDF的方法
2017/11/10 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
个人租房协议书(范本)
2014/10/14 职场文书
党员转正意见怎么写
2015/06/03 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
PHP获取学生成绩的方法
2021/11/17 PHP