GDを使ったレーダーチャートの作成 - PHPプロ!Q&A掲示板
キーワード / キーワードが設定されていません
画像は作成できたのですがこのソース上でprint関数を使うと
画像が表示されなくなってしまいます。
なぜなのでしょうか・・・。
- /**
- * エンコードタイプ
- * @const ENCODE_TYPE
- */
- define('ENCODE_TYPE', 'UTF-8');
- /**
- * レーダーサイズ
- * @const CHART_SIZE
- */
- define('CHART_SIZE', 100);
- /**
- * キャラクタサイズ
- * @const CHAR_SIZE
- */
- define('CHAR_SIZE', 4);
- /**
- * 組み込みフォント
- * @const CHAR_SIZE
- */
- define('FONT_BUILT_IN', 0);
- /**
- * TrueTypeフォント
- * @const FONT_TRUE_TYPE
- */
- define('FONT_TRUE_TYPE', 1);
- /**
- *レーダーチャートの出力
- *
- * @author 高橋 裕志郎 <yujiro@rakuto.net>
- * @package RKT_radar
- * @access public
- * @version 1.1
- */
- class RKT_radar
- {
- /**
- * イメージリソース
- * @var resource
- */
- var $rscimg = null;
- /**
- * イメージリソースのサイズ
- * @var array
- * $canvas['width'] 描画領域の幅
- * $canvas['height'] 描画領域の高さ
- */
- var $canvas = array();
- /**
- * 編集用の座標配列
- * @var array
- * $point['x'] X軸座標
- * $point['y'] Y軸座標
- */
- var $point = array();
- /**
- * 原点
- * @var array
- * $origin['x'] X軸座標
- * $origin['y'] Y軸座標
- */
- var $origin = array();
- /**
- * 項目数(頂点の数)
- * @var integer
- */
- var $num_column = 0;
- /**
- * 角度幅
- * @var integer
- */
- var $theta = 0;
- /**
- * 項目データ
- * @var array
- */
- var $columns = array();
- /**
- * 現在選択している色
- * @var integer
- */
- var $color = 0;
- /**
- * フォントサイズ
- * @var integer
- */
- var $font_size = 9;
- /**
- * フォントタイプ
- * @var string
- */
- var $fontfile = '';
- /**
- * フォントID
- * @var integer
- */
- var $font_id = 2;
- /**
- * テキスト出力モード
- * @var integer
- */
- var $font_mode = 5;
- /**
- * コンストラクタ
- *
- * @access public
- * @param integer [$width] 描画領域の幅
- * @param integer [$height] 描画領域の高さ
- */
- function RKT_radar($width=256,$height=256)
- {
- /* 描画領域 */
- $this->canvas['width'] = $width;
- $this->canvas['height'] = $height;
- /* 計算用原点 */
- $this->origin['x'] = (int)($width/2);
- $this->origin['y'] = (int)($height/2);
- /* フォントの設定 */
- $this->font_size = 10;
- /* OS毎に読み込み方を変更 */
- if (strtoupper(substr(PHP_OS, 0,3) == 'WIN')) {
- $this->fontfile = 'C:/WINDOWS/Fonts/msgothic.ttc';
- } else {
- $this->fontfile = '/usr/share/fonts/ja/TrueType/kochi-gothic.ttf';
- }
- $this->font_mode = FONT_BUILT_IN;
- }
- /**
- * 描画領域のリソースを新規に作成する
- *
- * @access public
- */
- function createImage()
- {
- $this->rscimg = @imagecreatetruecolor($this->canvas['width'],$this->canvas['height']);
- }
- /**
- * 描画領域のリソースを設定
- *
- * @access public
- * @param resource $rscimg 描画領域のリソース
- */
- function setImage(&$rscimg)
- {
- $this->rscimg =& $rscimg;
- }
- /**
- * 描画領域のリソースを取得
- *
- * @access public
- * @param resource $rscimg 描画領域のリソース
- */
- function &getImage()
- {
- return $this->rscimg;
- }
- /**
- * 色の指定
- *
- * @access public
- * @param integer $color
- */
- function setColor($color)
- {
- if (is_int($color)){
- $this->color = $color;
- } else if (is_string($color)){
- $colors = explode(',', $color);
- $this->color = ImageColorAllocate($this->rscimg,$colors[0],$colors[1],$colors[2]);
- }
- }
- /**
- * フォントサイズのセット
- *
- * @access public
- * @param integer $size フォントサイズ
- */
- function setFontSize($size)
- {
- $this->fontsize = $size;
- }
- /**
- * フォントファイルのセット
- *
- * @access public
- * @param integer $fontfile フォントファイル
- */
- function setFontFile($fontfile)
- {
- $this->fontfile = $fontfile;
- }
- /**
- * フォントモードのセット
- *
- * @access public
- * @param integer $font_mode フォントモードの
- */
- function setFontMode($font_mode)
- {
- $this->font_mode = $font_mode;
- }
- /**
- * フォントファイルのセット
- *
- * @access public
- * @param integer $fontfile フォントファイル
- */
- function setColumns($columns)
- {
- $this->num_column = count($columns);
- $this->theta = (int) (360/$this->num_column);
- $this->columns = $columns;
- }
- /**
- * 編集用座標のセット
- *
- * @access public
- * @param float $x x座標
- * @param float $x x座標
- */
- function setPoint($x,$y)
- {
- $this->point['x'] = $x;
- $this->point['y'] = $y;
- }
- /**
- * 座標の回転
- *
- * @access public
- * @param float $angle アングル
- * @return integer SINフラグ
- *
- * |x| |cosθ -sinθ 0|
- * |y| |sinθ cosθ 0|
- * |1| | 0 0 1|
- */
- function rotatePoint($angle)
- {
- $x = $this->point['x'];
- $y = $this->point['y'];
- $sin = sin(deg2rad($angle));
- $cos = cos(deg2rad($angle));
- $this->point['x'] = $x * $cos - $y * $sin;
- $this->point['y'] = $x * $sin + $y * $cos;
- $t_val = array(-1,0);
- $f_val = array(0,1);
- $flags = array();
- $flags['x'] = ($this->point['x'] >= 0)? 0:1;
- $flags['y'] = ($this->point['y'] >= 0)? $f_val[$this->font_mode]:$t_val[$this->font_mode];
- return ($flags);
- }
- /**
- * 座標の移動
- *
- * @access public
- * @param float $x X軸の移動ピクセル
- * @param float $y Y軸の移動ピクセル
- *
- * |x| |1 0 Tx|
- * |y| |0 1 Ty|
- * |1| |0 0 1 |
- */
- function movePoint($x,$y)
- {
- $this->point['x'] += $x;
- $this->point['y'] += $y;
- }
- /**
- * 外枠の作成
- *
- * @access public
- */
- function Polygon()
- {
- $polygon = array();
- $angle = 0;
- foreach ($this->columns as $row){
- $this->setPoint(0,-CHART_SIZE);
- $flags = $this->rotatePoint($angle);
- $this->movePoint($this->origin['x'],$this->origin['y']);
- $polygon[] = (int)$this->point['x'];
- $polygon[] = (int)$this->point['y'];
- $strlen = strlen($row['name']);
- $posx = $this->point['x'] + $strlen * -CHAR_SIZE * $flags['x'];
- $posy = $this->point['y'] + $this->font_size * $flags['y'];
- $title = mb_convert_encoding($row['name'], 'UTF-8', ENCODE_TYPE);
- $fnc_text[FONT_BUILT_IN] = 'ImageString($this->rscimg,$this->font_id,$posx,$posy,$title,$this->color);';
- $fnc_text[FONT_TRUE_TYPE]= 'ImageTTFText($this->rscimg,$this->font_size,0,$posx,$posy,$this->color,$this->fontfile,$title);';
- eval($fnc_text[$this->font_mode]);
- $angle += $this->theta;
- }
- imagepolygon($this->rscimg, $polygon, $this->num_column, $this->color);
- }
- /**
- * 放射線の作成
- *
- * @access public
- */
- function Radiation()
- {
- $angle = 0;
- foreach ($this->columns as $row){
- $this->setPoint(0,-CHART_SIZE);
- $this->rotatePoint($angle);
- $this->movePoint($this->origin['x'],$this->origin['y']);
- $posx = (int)$this->point['x'];
- $posy = (int)$this->point['y'];
- imageline ($this->rscimg,$this->origin['x'],$this->origin['y'],$posx,$posy,$this->color);
- $angle += $this->theta;
- }
- }
- /**
- * 放射線の作成
- *
- * @access public
- */
- function gridNumber()
- {
- $this->setPoint(-10,+10);
- $this->movePoint($this->origin['x'],$this->origin['y']);
- $posx = (int)$this->point['x']-10;
- $posy = (int)$this->point['y'];
- $fnc_text[FONT_BUILT_IN] = 'ImageChar($this->rscimg,$this->font_id,$posx,$posy,"0%",$this->color);';
- $fnc_text[FONT_TRUE_TYPE]= 'ImageTTFText($this->rscimg,$this->font_size,0,$posx,$posy,$this->color,$this->fontfile,"0%");';
- eval($fnc_text[$this->font_mode]);
- $this->setPoint(-16,-CHART_SIZE/2+10);
- $this->movePoint($this->origin['x'],$this->origin['y']);
- $posx = (int)$this->point['x']-10;
- $posy = (int)$this->point['y'];
- $fnc_text[FONT_BUILT_IN] = 'ImageString($this->rscimg,$this->font_id,$posx,$posy,"50%",$this->color);';
- $fnc_text[FONT_TRUE_TYPE]= 'ImageTTFText($this->rscimg,$this->font_size,0,$posx,$posy,$this->color,$this->fontfile,"50%");';
- eval($fnc_text[$this->font_mode]);
- $this->setPoint(-20,-(CHART_SIZE)+10);
- $this->movePoint($this->origin['x'],$this->origin['y']);
- $posx = (int)$this->point['x']-10;
- $posy = (int)$this->point['y'];
- $fnc_text[FONT_BUILT_IN] = 'ImageString($this->rscimg,$this->font_id,$posx,$posy,"100%",$this->color);';
- $fnc_text[FONT_TRUE_TYPE]= 'ImageTTFText($this->rscimg,$this->font_size,0,$posx,$posy,$this->color,$this->fontfile,"100%");';
- eval($fnc_text[$this->font_mode]);
- }
- /**
- * レーダーの作成
- *
- * @access public
- * @param string $fill 塗りつぶし色
- * @param string $line 線色
- */
- function Radar($line, $fill)
- {
- $polygon = array();
- $angle = 0;
- foreach ($this->columns as $row){
- $this->setPoint(0,-($row['value']));
- $this->rotatePoint($angle);
- $this->movePoint($this->origin['x'],$this->origin['y']);
- $values[] = $row['value'];
- $angles[$row['value']] = $angle;
- $polygon[] = (int)$this->point['x'];
- $polygon[] = (int)$this->point['y'];
- $posx = (int)$this->point['x'];
- $posy = (int)$this->point['y'];
- $angle += $this->theta;
- }
- /* 塗りつぶした多角形を描画する */
- $this->setColor($fill);
- imageFilledPolygon ($this->rscimg, $polygon, $this->num_column, $this->color);
- /* 多角形を描画する */
- $this->setColor($line);
- imagePolygon ($this->rscimg, $polygon, $this->num_column, $this->color);
- }
- /**
- * レーダーチャートの作成
- *
- * @access public
- */
- function radarChart()
- {
- /* 背景の色設定 */
- $this->setColor('255,255,255');
- imagefill($this->rscimg, 0, 0, $this->color);
- /* グラフの外枠と項目名 */
- $this->setColor('100,100,100');
- $this->Polygon();
- /* レーダー部分の設定 */
- $this->Radar('200,0,0', '255,100,100');
- /* 放射線部分の設定 */
- $this->setColor('200,200,200');
- $this->Radiation();
- /* 目盛りの数字部分の設定 */
- $this->setColor('100,100,0');
- $this->gridNumber();
- }
- }
- print 'ここ<br>';
- ini_set('display_errors',0);
- header('Content-type:image/Png');
- /* valueの最大値は100までです。 */
- $columns = array(
- array('name'=>'test', 'value'=>70),
- array('name'=>'test', 'value'=>85),
- array('name'=>'test', 'value'=>100),
- array('name'=>'test', 'value'=>100),
- array('name'=>'test', 'value'=>100)
- );
- $im = ImageCreate(350,350);
- $bg = imagecolorallocate($im, 255, 255, 255);
- $objrdr = new RKT_radar(350,350);
- $objrdr->setImage($im);
- $objrdr->setColumns($columns);
- /* TrueTypeフォントを使用する */
- $objrdr->setFontMode(FONT_TRUE_TYPE);
- $objrdr->setFontFile('seap.ttf');
- $objrdr->radarChart();
- ImagePng($im);
- ImageDestroy($im);
この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。





ページのトップへ


kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。