나는 항상 뭔가를 출판하고 싶었습니다. 나는 최근에 php4에서 php_gd.dll을 마쳤고, 함께 사용할 그래픽 프로그램을 만들고 싶습니다. PHP로 파이차트를 만드는 예제를 많이 봤고, 살펴보니 모두 2차원이어서 3차원으로 만들고 싶었습니다. 열심히 노력한 끝에 Pie3d가 완성되고, 좋은 내용은 모두와 공유됩니다. 그러나 저는 PHP를 처음 사용하기 때문에 코드가 충분히 다듬어지지 않았을 수 있습니다. 모두가 저에게 조언을 해주고 이 프로그램을 개선하기 위해 함께 노력할 수 있기를 바랍니다. 저에게 꼭 알려주세요 ( [email protected] )
+------------+
|pi3dfun.php//공용 함수|
+------------+
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)));
}
함수 chx_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//타원 호 함수
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
목록($x0,$y0)=chx_getexy($a,$b,$d);
for($i=0;$i<$n;$i++){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
목록($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;
목록($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);
목록($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);
목록($x,$y)=chx_getexy($a/2,$b/2,($d+$sd)/2);
imagefill($img,$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);
if($sd<180){
list($R,$G,$B)=chx_getdarkcolor($img,$clr);
$clr=이미지색상할당($img,$R,$G,$B);
if($ed>180) $ed=180;
목록($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);
}
}
함수 chx_getindexcolor($img,$clr){//색을 색인화하는 RGB
$R=($clr>>16) & 0xff;
$G=($clr>>8)& 0xff;
$B=($clr) & 0xff;
return imagecolorallocate($img,$R,$G,$B);
}
?>
+---------------+
| Pie3d.php //3차원 원형 차트 파일 |
+-------------+
require("pie3dfun.php")
$a=150;//타원 주요 반축
$b=50;//타원 세그먼트 반축
$v=20;//둥근 케이크의 높이
$font=5;//글꼴
$ox=5+$a;
$oy=5+$b;
$fw=이미지폰트폭($font);
$fh=이미지폰트높이($font);
$datLst=배열(30,10,20,20,10,20,10,20);//데이터
$labLst=array("a1","a2","a3","a4","a5","a6","a7","a8");//레이블
$clrLst=배열(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=이미지색상할당($img,0xff,0xff,0xff);
$clrt=이미지색상할당($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]);
//라벨 그리기
imagefilled직사각형($img,5,$ly,5+$fw,$ly+$fh,$clrLst[$i]);
imageRectangle($img,5,$ly,5+$fw,$ly+$fh,$clrt);
이미지스트링($img,$font,5+2*$fw,$ly,
$labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)",
$clrt);
$ly+=$fh+2;
}
//그래픽 출력
header("콘텐츠 유형:이미지/gif");
gif
($img);