//
圖形類->gd.class.php
<?
php

class
?GD{
?
/*
?
函數說明?
$data:y軸數據(數組)?
$graphdata:y軸數據--百分比(數組)?
$label:x軸數據(數組)?
$height:圖像高度?
$width:圖像寬度?
$font:字號?
$dot:決定點的大小?
$bg:背景色?
$line?:線色?
$text?:文本色?
$dotcolor:點色?
$file:輸出圖像文件名?
*/
?
//
線形圖的函數
function
?qximage(
$data
?
,
?
$graphdata
,
?
$label
?
,
?
$height
,
?
$width
?
,
?
$font
,
?
$dot
,
?

$bg
,
?
$line
,
?
$text
,
?
$dotcolor
,
?
$file
)?
{?
$jc
=
$height
/
100
;?
$fontwidth
=
?imagefontwidth?(
$font
);?
$fontheight
=
imagefontheight(
$font
);?

$image
=
?imagecreate?(
$width
,
$height
+
20
);?
$bg
=
?imagecolorallocate(
$image
?
,
$bg
[
0
]
,
$bg
[
1
]
,
$bg
[
2
]);?
$line
=
imagecolorallocate(
$image
?
,
$line
[
0
]
,
$line
[
1
]
,
$line
[
2
]);?
$text
=
imagecolorallocate(
$image
?
,
$text
[
0
]
,
$text
[
1
]
,
$text
[
2
]);?
$dotcolor
=
imagecolorallocate(
$image
?
,
$dotcolor
[
0
]
,
$dotcolor
[
1
]
,
$
$dotcolor
[
2
]);?
imageline?(
$image
,
0
,
0
,
0
,
$height
,
$line
);?
imageline(
$image
,
0
,
$height
,
$width
,
$height
,
$line
);?
for
?(
$i
=
1
;
$i
<
11
;
$i
++
)?
{?
?imagedashedline(
$image
,
0
,
$height
?
-
?
$jc
*
$i
*
10
?
,
$width
?
,
$height
?
-
$jc
*
$i
*
10
?

,
$line
?);?
?imagestring?(
$image
,
$font
,
0
,
$height
-
$jc
*
$i
*
10
,
$i
*
10
,
$text
);?
}?
for
?(
$i
=
0
;
$i
?{?
?
#
echo?$tmp."?";?
?
$x1
=
((
$width
-
50
)
/
count
(
$data
))
*
(
$i
)
+
40
;?
?
#
echo?$x1?."?";?
?
$y1
=
$height
-
$graphdata
[
$i
]
*
$jc
;?
?
$x2
=
$x1
;?
?
$y2
=
$y1
+
$graphdata
[
$i
]
*
$jc
;?
?
#
echo?$y1."?";?
?imagestring(
$image
,
$font
,
$x1
,
$y1
-
2
*
$fontheight
,
$graphdata
[
$i
]
.
"
%(
"
.
$data
[
$i
]
.
"
)
"
,
$text
);?
?imagearc?(
$image
,
$x1
?
,
$y1
,
$dot
,
$dot
,
0
,
360
,
$dotcolor
);?
?imagefilltoborder?(
$image
,
$x1
,
$y1
,
$dotcolor
,
$dotcolor
);?
?imagestring?(
$image
,
$font
,
$x1
,
$y2
,
$label
[
$i
]
,
$text
);?
?
if
?(
$i
>
0
)?
?{?
??imageline(
$image
,
$tmpx1
,
$tmpy1
,
$x1
,
$y1
,
$line
);?
?}?
?
$tmpx1
=
$x1
;
$tmpy1
=
$y1
;?
}?
imagegif?(
$image
,
$file
);?
}?
//
為了方便起見,我又做了一個函數來制作柱型圖
/*
參數說明:
$graphdata:百分比數據(y軸)
$label:x軸標題
$data:實際數據(y軸)
$graphwidth:圖像寬度
$graphheight:圖像高度
$graphscale:高度因子(為$graphheight/100)
$graphfont:字體號
$bg;背景顏色值
$text:文本顏色值
$grid:邊線顏色值
$bar:柱的顏色值
$bz:備注(不支持中文呀)
*/
?
function
?timage(
?
$graphdata
,
$label
,
$data
,
?
$graphwidth
,
$graphheight
,
$graphscale
,
$graphfont
,
?
$bg
,
$text
,
$grid
,
$bar
,
$bz
)
?{

?
header
(
"
Content-type:image/gif
"
);
?
$image
=
imagecreate(
$graphwidth
+
50
,
$graphheight
+
50
);
?
$bgcolor
=
?imagecolorallocate?(
$image
?
,
$bg
[
0
]
,
$bg
[
1
]
,
$bg
[
2
]);
?
$textcolor
=
?imagecolorallocate?(
$image
?
,
$text
[
0
]
,
$text
[
1
]
,
$text
[
2
]);
?
$gridcolor
=
imagecolorallocate?(
$image
?
,
$grid
[
0
]
,
$grid
[
1
]
,
$grid
[
2
]);
?
$barcolor
=
imagecolorallocate?(
$image
?
,
$bar
[
0
]
,
$bar
[
1
]
,
$bar
[
2
]);
?
$gridabelwidth
=
imagefontwidth(
$graphfont
)
*
3
+
1
;
?
$gridableheight
=
?imagefontheight?(
$graphfont
);
?imageline(
$image
,
$gridlabelwidth
,
0
,
$gridlabelwidth
,
$graphheight
-
1
,
$gridcolor
);
?imageline(
$image
,
0
,
$graphheight
-
1
,
$graphwidth
-
1
,
$graphheight
-
1
,
$gridcolor
);
?
for
(
$i
=
0
;
$i
<
$graphheight
;
$i
+=
$graphheight
/
10
)
?{
??imagedashedline?(
$image
,
0
,
$i
,
$graphwidth
-
1
,
$i
,
$gridcolor
);
??imagestring(
$image
,
$graphfont
,
0
,
$i
,
round
((
$graphheight
-
$i
)
/
$graphscale
)
,
$textcolor
);
?}

?
$barwidth
=
((
$graphwidth
-
$gridlabelwidth
)
/
count
(
$graphdata
))
-
30
;
#
¿ØÖÆÖùµÄ×
&
Uuml;
&
iquest;í
&
para;
&
Egrave;
?
for
(
$i
=
0
;
$i
?{
??
$bartopx
=
$gridlabelwidth
+
((
$i
+
1
)
*
20
)
+
(
$i
*
$barwidth
);
#
¿ØÖÆÖù¿¿×
ó
&
micro;
&
Auml;
&
frac34;à
&
Agrave;
&
euml;
??
$barbottomx
=
$bartopx
+
$barwidth
;??
$barbottomy
=
$graphheight
-
1
;
#
¿ØÖÆÖùµÄϱ
&
szlig;
&
frac12;
&
ccedil;
??
$bartopy
=
$barbottomy
-
(
$graphdata
[
$i
]
*
$graphscale
);
??imagefilledrectangle

(
$image
,
$bartopx
,
$bartopy
,
$barbottomx
,
$barbottomy
,
$barcolor
);
??
$labelx1
=
$bartopx
;
??
$labely1
=
$bartopy
-
15
;
??
$labelx2
=
$bartopx
;
??
$labely2
=
$graphheight
;
??imagestring(
$image
,
$graphfont
,
$labelx1
,
$labely1
,
"
$graphdata

[$i]
"
.
"
%
"
,
$textcolor
);
??imagestring(
$image
,
$graphfont
,
$labelx2
,
$labely2
,
"
$label[$i]
"
,
$textcolor
);
??imagestringup?(
$image
,
$graphfont
,
$labelx1
+
10
,
$labely1
-
$gridableheight
,
"
$data[$i]
"
,
$textcolor
);
?}
?imagestring(
$image
,
$graphfont
,
1
,
$graphheight
+
30
,
$bz
,
$textcolor
);
?imagegif?(
$image
);
?}

//
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
?
'
<IMG?SRC="
'
.
$imgFileName
.
'
"?BORDER="1"?ALT="統計餅圖">
'
;?
}?

$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
);?
?>
?
//圖形類->gd.class.php
<?php
class GD{
?/*
函數說明
$data:y軸數據(數組)
$graphdata:y軸數據--百分比(數組)
$label:x軸數據(數組)
$height:圖像高度
$width:圖像寬度
$font:字號
$dot:決定點的大小
$bg:背景色
$line :線色
$text :文本色
$dotcolor:點色
$file:輸出圖像文件名
*/
//線形圖的函數
function qximage($data , $graphdata, $label , $height, $width , $font, $dot,
$bg, $line, $text, $dotcolor, $file)
{
$jc=$height/100;
$fontwidth= imagefontwidth ($font);
$fontheight=imagefontheight($font);
$image= imagecreate ($width,$height+20);
$bg= imagecolorallocate($image ,$bg[0],$bg[1],$bg[2]);
$line=imagecolorallocate($image ,$line[0],$line[1],$line[2]);
$text=imagecolorallocate($image ,$text[0],$text[1],$text[2]);
$dotcolor=imagecolorallocate($image ,$dotcolor[0],$dotcolor[1],$$dotcolor[2]);
imageline ($image,0,0,0,$height,$line);
imageline($image,0,$height,$width,$height,$line);
for ($i=1;$i<11;$i++)
{
?imagedashedline($image,0,$height - $jc*$i*10 ,$width ,$height -$jc*$i*10
,$line );
?imagestring ($image,$font,0,$height-$jc*$i*10,$i*10,$text);
}
for ($i=0;$i {
?#echo $tmp." ";
?$x1=(($width-50)/count($data))*($i)+40;
?#echo $x1 ." ";
?$y1=$height-$graphdata[$i]*$jc;
?$x2=$x1;
?$y2=$y1+$graphdata[$i]*$jc;
?#echo $y1." ";
?imagestring($image,$font,$x1,$y1-2*$fontheight,$graphdata[$i]."%(".$data
[$i].")",$text);
?imagearc ($image,$x1 ,$y1,$dot,$dot,0,360,$dotcolor);
?imagefilltoborder ($image,$x1,$y1,$dotcolor,$dotcolor);
?imagestring ($image,$font,$x1,$y2,$label[$i],$text);
?if ($i>0)
?{
? imageline($image,$tmpx1,$tmpy1,$x1,$y1,$line);
?}
?$tmpx1=$x1;$tmpy1=$y1;
}
imagegif ($image,$file);
}
//為了方便起見,我又做了一個函數來制作柱型圖
/*參數說明:
$graphdata:百分比數據(y軸)
$label:x軸標題
$data:實際數據(y軸)
$graphwidth:圖像寬度
$graphheight:圖像高度
$graphscale:高度因子(為$graphheight/100)
$graphfont:字體號
$bg;背景顏色值
$text:文本顏色值
$grid:邊線顏色值
$bar:柱的顏色值
$bz:備注(不支持中文呀)
*/
?function timage(
?$graphdata,$label,$data,
?$graphwidth,$graphheight,$graphscale,$graphfont,
?$bg,$text,$grid,$bar,$bz)
?{
?header("Content-type:image/gif");
?$image=imagecreate($graphwidth+50,$graphheight+50);
?$bgcolor= imagecolorallocate ($image ,$bg[0],$bg[1],$bg[2]);
?$textcolor= imagecolorallocate ($image ,$text[0],$text[1],$text[2]);
?$gridcolor=imagecolorallocate ($image ,$grid[0],$grid[1],$grid[2]);
?$barcolor=imagecolorallocate ($image ,$bar[0],$bar[1],$bar[2]);
?$gridabelwidth=imagefontwidth($graphfont)*3+1;
?$gridableheight= imagefontheight ($graphfont);
?imageline($image,$gridlabelwidth,0,$gridlabelwidth,$graphheight-
1,$gridcolor);
?imageline($image,0,$graphheight-1,$graphwidth-1,$graphheight-1,$gridcolor);
?for($i=0;$i<$graphheight;$i+=$graphheight/10)
?{
? imagedashedline ($image,0,$i,$graphwidth-1,$i,$gridcolor);
? imagestring($image,$graphfont,0,$i,round(($graphheight-$i)/
$graphscale),$textcolor);
?}
?$barwidth=(($graphwidth-$gridlabelwidth)/count($graphdata))-
30;#¿ØÖÆÖùµÄ×
Ü¿í¶È
?for($i=0;$i {
? $bartopx=$gridlabelwidth+(($i+1)*20)+
($i*$barwidth);#¿ØÖÆÖù¿¿×
óµÄ¾àÀë
? $barbottomx=$bartopx+$barwidth;? $barbottomy=$graphheight-
1;#¿ØÖÆÖùµÄϱ
᫇
? $bartopy=$barbottomy-($graphdata[$i]*$graphscale);
? imagefilledrectangle
($image,$bartopx,$bartopy,$barbottomx,$barbottomy,$barcolor);
? $labelx1=$bartopx;
? $labely1=$bartopy-15;
? $labelx2=$bartopx;
? $labely2=$graphheight;
? imagestring($image,$graphfont,$labelx1,$labely1,"$graphdata
[$i]"."%",$textcolor);
? imagestring($image,$graphfont,$labelx2,$labely2,"$label[$i]",$textcolor);
? imagestringup ($image,$graphfont,$labelx1+10,$labely1-
$gridableheight,"$data[$i]",$textcolor);
?}
?imagestring($image,$graphfont,1,$graphheight+30,$bz,$textcolor);
?imagegif ($image);
?}
//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 '<IMG SRC="'.$imgFileName.'" BORDER="1" ALT="統計餅圖">';
}
$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);
?>