円グラフ
ずっと何かを出版したいと思っていました。最近、php4 の php_gd.dll を完成させたばかりなので、グラフィック プログラムを作成して遊ぶのが待ちきれません。 PHPで円グラフを作成する例をたくさん見ましたが、それらはすべて2次元だったので、3次元のものを作りたいと思いました。苦労の末、pie3d が完成し、出来上がったものはみんなで共有します。ただし、私は PHP を初めて使用するため、コードが十分に洗練されていない可能性があります。皆さんにアドバイスをいただき、このプログラムを改善するために協力していただければ幸いです。忘れずに (estorm@yeah.net) に通知してください
+------------------------+
| 公開関数| + ------------------------+
define("ANGLE_STEP",5);//楕円弧を描く際の角度ステップを定義する
関数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))); $oy,$ a,$b,$sd,$ed,$clr){//楕円弧関数
$n=ceil(($ed-$sd)/ANGLE_STEP); ($x0, $y0)=chx_getexy($a,$b,$d);
for($i=0;$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
}
}
関数 chx_sector($img,$ox,$oy,$a,$ b,$sd ,$ed,$clr){// ファンを描画します
$n=ceil(($ed-$sd)/ANGLE_STEP)
list($x0,$y0); =chx_getexy($a,$b,$d);
イメージライン($img,$x0+$ox,$y0+$oy,$ox,$oy,$clr); $n;$i++ ){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
list($x,$y)=chx_getexy($a,$b, $d);
イメージライン($x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr);
imageline($img,$x0+$ox,$y0+$oy,$ox,$oy,$clr);
list($x,$y)=chx_getexy($a/2,$b/2,($) d+$sd)/ 2);
imagefill($x+$ox,$y+$oy,$clr);
}
関数 chx_sector3d($img,$ox,$oy,$a,$b, $v,$sd ,$ed,$clr){//3D セクター
chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr); ;180){
list($R,$G,$B)=chx_getdarkcolor($img,$clr)
$clr=imagecolorallocate($img,$R,$G,$B); ;180) $ed =180;
リスト($sx,$sy)=chx_getexy($a,$b,$sd);
$sy+=$oy; $ey)=chx_getexy ($a,$b,$ed);
$ey+=$oy; $clr);
イメージライン($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); =$ox;
imagefill($img,$sx,$sy,$clr);
}
}
function chx_getindexcolor($img,$clr){//RBG をインデックスカラーにします
$R=($clr> >16) & 0xff;
$G=($clr>>8)& 0xff;
return imagecolorallocate($img,$R,$G,$B);
}
? >
+---------------+
| 3 次元の円グラフ ファイル|
+--------------+
require("pie3dfun.php");/ /楕円長半径
$b =50;//楕円セグメント長軸
$v=20;//丸いケーキの高さ
$font=5;//フォント
$ox=5+$a;
$oy=5+$b;
$fh=画像フォントの高さ($font); ,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+$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($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); 5+2*$fw,$ly,
$ labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot)) /100)."%)",
$clrt );
$ly+=$fh+2
//出力グラフィックス
header("Content-type:image/gif"); ;
?>