本版
帖子
日志
相册
群组
用户
登陆
|
注册
|
TS首页
今日热议主题
请问海外 WordPress 托管服务哪家强?
新冠常备药,大家准备了么?
人工智能后端工程师
[北京/杭州/南京] 阿里云网络社招,多个 hc
硅谷 FinTech 公司找优秀的机器学习工程师
[飞书-IM 团队] IM 团队缺人,欢迎社招简历
[ app.json 文件内容错误] app.json: 在项
北京地铁31号线,对亦庄、大兴、丰台、房山
『央视新闻』大发棋牌邀请码获取方法「手机
央视新闻《彩票软件真的能赚钱吗》手机搜狐
首页
›
快活林
›
猿氏悟语
›
打造超酷的PHP数据饼图
By:
冰客
发表于 2008-11-7 14:54:26 · 5380次点击 回复:0
来源:PHPchina 作者:visam
源代码:
PHP代码如下:
//+------------------------+
//| pie3dfun.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
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
}
$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);
?>
5380次点击
0个回复
|
直到 2008-11-7 14:54:26
↑
回到顶部
添加一条新回复
您需要登录后才可以回帖
登录
|
成为会员
发表回复
回帖后跳转到最后一页
← TechSir
标签云
|
手机版
|
科技先生
(
京ICP备07036130号 Powered by Discuz! X
)
GMT+8, 2024-12-22 16:46