ロックオン開発チームブログ -Lockon Knowledge Repositories-

PHPで円グラフを作ろう(2)

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

続きまして、影感を出すためにちょっとずらして、 円柱の側面を描画します。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;
		}
	}
}
2.png

次に、円柱の蓋の部分です。実はこの蓋の部分だけで、 円グラフとしては成立するのですが。。ここでは、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;
}
3.png

あとは、縁取りして完成にもっていきます。
// 上面の縁取り
$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);
4.png

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

Trackback

このエントリーのトラックバックURL:
http://www.lockon.co.jp/cgi-bin/mt/mt-tb.cgi/82

コメント



Copyright(c) LOCKON CO.,LTD. All Rights Reserved.