PHPで円グラフを作ろう(2)
大反響を呼んだ「PHPで円グラフを作ろう」の第2弾です!!
ここでは、細かい描画処理を追っていきたいと思います。
円柱を描画するのに、まずは影にあたる部分を描画します。
こちらは、灰色の円を書いているだけです。

続きまして、影感を出すためにちょっとずらして、 円柱の側面を描画します。imagearcという弓なりの線を描画できる関数を利用しています。 こちら若干癖があるので、数値を補正しています。
次に、円柱の蓋の部分です。実はこの蓋の部分だけで、 円グラフとしては成立するのですが。。ここでは、imagefilledarcというピザのような形を描画できる 関数を用います。
あとは、縁取りして完成にもっていきます。
業務ではあまり利用することはないかもしれませんが、いろいろ試してみると面白いです。
上記で利用したクラスはEC-CUBEの配布ソースに含まれていますので、興味のある方は、ご自由にダウンロードしてみてください。
// 影の描画
if($objGraphPie->shade_on) {
$objGraphPie->drawShade();
}

続きまして、影感を出すためにちょっとずらして、 円柱の側面を描画します。imagearcという弓なりの線を描画できる関数を利用しています。 こちら若干癖があるので、数値を補正しています。
// 色数の取得
$c_max = count($objGraphPie->arrColor);
$dc_max = count($objGraphPie->arrDarkColor);
// 側面の描画
for ($i = ($y + $z - 1); $i >= $y; $i--) {
$start = 0;
for($j = 0; $j < $rd_max; $j++) {
// 角度が0度以上の場合のみ側面を描画する。
if($arrRad[$j] > 0) {
$end = $start + $arrRad[$j];
if($start == 0 && $end == 360) {
// -90~270で指定すると円が描画できないので0~360に指定
imagearc($objGraphPie->image, $x, $i, $w, $h, 0, 360, $objGraphPie->arrDarkColor[($j % $dc_max)]);
} else {
// -90°は12時の位置から開始するように補正している
imagearc($objGraphPie->image, $x, $i, $w, $h, $start - 90, $end - 90, $objGraphPie->arrDarkColor[($j % $dc_max)]);
}
$start = $end;
}
}
}

次に、円柱の蓋の部分です。実はこの蓋の部分だけで、 円グラフとしては成立するのですが。。ここでは、imagefilledarcというピザのような形を描画できる 関数を用います。
// 底面の描画
imagearc($objGraphPie->image, $x, $y + $z, $w, $h, 0, 180 , $objGraphPie->flame_color);
// 上面の描画
$start = 0;
for($i = 0; $i < $rd_max; $i++) {
$end = $start + $arrRad[$i];
if($start == 0 && $end == 360) {
// -90~270で指定すると円が描画できないので0~360に指定
imagefilledarc($objGraphPie->image, $x, $y, $w, $h, 0, 360, $objGraphPie->arrColor[($i % $c_max)], IMG_ARC_PIE);
} else {
// -90°は12時の位置から開始するように補正している。
imagefilledarc($objGraphPie->image, $x, $y, $w, $h, $start - 90, $end - 90, $objGraphPie->arrColor[($i % $c_max)], IMG_ARC_PIE);
}
$start = $end;
}

あとは、縁取りして完成にもっていきます。
// 上面の縁取り
$start = 0;
for($i = 0; $i < $rd_max; $i++) {
$end = $start + $arrRad[$i];
if($start == 0 && $end == 360) {
// -90~270で指定すると円が描画できないので0~360に指定
imagearc($objGraphPie->image, $x, $y, $w, $h, 0, 360 , $objGraphPie->flame_color);
}
// -90°は12時の位置から開始するように補正している。
imagefilledarc($objGraphPie->image, $x, $y, $w, $h, $start - 90, $end - 90, $objGraphPie->flame_color, IMG_ARC_EDGED|IMG_ARC_NOFILL);
$start = $end;
}
// 側面の縁取り
imageline($objGraphPie->image, $x + ($w / 2), $y, $x + ($w / 2), $y + $z, $objGraphPie->flame_color);
imageline($objGraphPie->image, $x - ($w / 2), $y, $x - ($w / 2), $y + $z, $objGraphPie->flame_color);

業務ではあまり利用することはないかもしれませんが、いろいろ試してみると面白いです。
上記で利用したクラスはEC-CUBEの配布ソースに含まれていますので、興味のある方は、ご自由にダウンロードしてみてください。

