在画立体柱形图时遇到的问题?

tjyihui 2003-10-20 04:12:56
以前画二维平面柱形图时只要动态设定好柱形图的高度就可以了,但是在画立体柱形图时,因为要涉及到长方体的3个可见面,而变得很复杂,请问该如何画呢?
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyujie2000 2003-10-21
  • 打赏
  • 举报
回复
好东西,收藏一下,
tjyihui 2003-10-21
  • 打赏
  • 举报
回复
老大们
你们的代码怎么一点注释都没有呀
xuzuning 2003-10-21
  • 打赏
  • 举报
回复
<?
/**
函数 Bar3d 用于绘制3三维条形图
使用世界坐标系,即原点在左下角。函数中做了WC-DC的转换
*/
function getRGB($color){
$R=($color>>16) & 0xff;
$G=($color>>8) & 0xff;
$B=($color) & 0xff;
return (array($R,$G,$B));
}
function setColor(&$im,$color) {
list($R,$G,$B) = getRGB($color);
return imagecolorallocate($im,$R,$G,$B);
}
function Bar3d(&$image,$x,$y,$w,$h,$z,$color=0xffffff,$angle=45) {
$dw = ceil($z*sin(deg2rad($angle)));
$dh = ceil($z*cos(deg2rad($angle)));
$im = imagecreate($w+abs($dw),$h+abs($dh));
$mx = imagesx($im);
$my = imagesy($im);
list($R,$G,$B) = getRGB($color);
$bg = imagecolorallocate($im,256-$R,256-$G,256-$B);
imagecolortransparent($im,$bg);
$a = array(0,$my, $w,$my, $w+$dw,$my-$dh, $dw,$my-$dh);
for($i=0;$i<8;$i+=2) {
$b[] = $a[$i];
$b[] = $a[$i+1]-$h;
}
if($dw < 0)
for($i=0;$i<8;$i+=2) {
$a[$i] -= $dw;
$b[$i] -= $dw;
}
if($dh < 0)
for($i=1;$i<8;$i+=2) {
$a[$i] += $dh;
$b[$i] += $dh;
}
$k = 0.8;
if($dh > 0)
imagefilledPolygon($im,$b,4,imagecolorallocate($im,$R*$k,$G*$k,$B*$k));
else
imagefilledPolygon($im,$a,4,imagecolorallocate($im,$R*$k,$G*$k,$B*$k));
if($dw > 0)
imagefilledPolygon($im,array($a[2],$a[3],$b[2],$b[3],$b[4],$b[5],$a[4],$a[5]),4,imagecolorallocate($im,$R/2,$G/2,$B/2));
else
imagefilledPolygon($im,array($a[6],$a[7],$b[6],$b[7],$b[0],$b[1],$a[0],$a[1]),4,imagecolorallocate($im,$R/2,$G/2,$B/2));
imagefilledPolygon($im,array($a[0],$a[1],$b[0],$b[1],$b[2],$b[3],$a[2],$a[3]),4,imagecolorallocate($im,$R,$G,$B));
imagecopyresized($image,$im,$x,imagesy($image)-$y-$my,0,0,$mx,$my,$mx,$my);
return $image;
}

/*** 测试例 ***/
$im = imagecreate(200,200);
setColor($im,0xefefef);

$color = array(0xff0000,0x00ff00,0x0000ff,0xffff00);
$data = array(
array(40,30,75,40),
array(20,40,30,10),
array(10,20,30,20)
);

foreach($data as $v) {
$m[] = max($v);
$cell[] = count($v);
}
$m = max($m);
$cell = max($cell);
$x = 10;
$y = 10;
$z = 10;
$kx = floor(floor((imagesx($im)-3*$x)/count($data))/$cell);
$ky = (imagesy($im)-3*$y)/$m;

foreach($data as $v) {
foreach($v as $i=>$d) {
Bar3d($im,$x,$y,$kx,$d*$ky,$z,$color[$i]);
$x += $kx;
}
$x = ceil($x+4);
}

header("Content-type: image/gif");
imagepng($im);
imagedestroy($im);
?>
skystar008 2003-10-20
  • 打赏
  • 举报
回复
这是画平面扇面的函数
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);
}
skystar008 2003-10-20
  • 打赏
  • 举报
回复
这是一个画3D扇面的函数.
function chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clr)
{
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);
}
}

21,881

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧