This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/includes/pear/Image/Graph/Axis/Radar.php

204 lines
5.8 KiB
PHP
Raw Normal View History

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class for axis handling.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Radar.php,v 1.6 2005/08/03 21:22:11 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Axis/Category.php
*/
require_once 'Image/Graph/Axis/Category.php';
/**
* Displays an 'X'-axis in a radar plot chart.
*
* This axis maps the number of elements in the dataset to a angle (from 0-
* 360 degrees). Displaying the axis consist of drawing a number of lines from
* center to the edge of the 'circle' than encloses the radar plot. The labels
* are drawn on the 'ends' of these radial lines.
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Axis_Radar extends Image_Graph_Axis_Category
{
/**
* Specifies the number of pixels, the labels is offsetted from the end of
* the axis
*
* @var int
* @access private
*/
var $_distanceFromEnd = 5;
/**
* Gets the minimum value the axis will show.
*
* This is always 0
*
* @return double The minumum value
* @access private
*/
function _getMinimum()
{
return 0;
}
/**
* Gets the maximum value the axis will show.
*
* This is always the number of labels passed to the constructor.
*
* @return double The maximum value
* @access private
*/
function _getMaximum()
{
return count($this->_labels);
}
/**
* Calculate the delta value (the number of pixels representing one unit
* on the axis)
*
* @return double The label interval
* @access private
*/
function _calcDelta()
{
if (abs($this->_getMaximum() - $this->_getMinimum()) == 0) {
$this->_delta = false;
} else {
$this->_delta = 360 / ($this->_getMaximum() - $this->_getMinimum());
}
}
/**
* Get the pixel position represented by a value on the canvas
*
* @param double $value the value to get the pixel-point for
* @return double The pixel position along the axis
* @access private
*/
function _point($value)
{
return (90 + (int) ($this->_value($value) * $this->_delta)) % 360;
}
/**
* Get the size in pixels of the axis.
*
* For a radar plot this is always 0
*
* @return int The size of the axis
* @access private
*/
function _size()
{
return 0;
}
/**
* Sets the distance from the end of the category lines to the label.
*
* @param int $distance The distance in pixels
*/
function setDistanceFromEnd($distance = 5)
{
$this->_distanceFromEnd = $distance;
}
/**
* Draws axis lines.
*
* @access private
*/
function _drawAxisLines()
{
}
/**
* Output an axis tick mark.
*
* @param int $value The value to output
* @access private
*/
function _drawTick($value, $level = 1)
{
$centerX = (int) (($this->_left + $this->_right) / 2);
$centerY = (int) (($this->_top + $this->_bottom) / 2);
$radius = min($this->height(), $this->width()) / 2;
$endPoint = array ('X' => $value, 'Y' => '#max#');
$dX = $this->_pointX($endPoint);
$dY = $this->_pointY($endPoint);
$offX = ($dX - $centerX);
$offY = ($dY - $centerY);
$hyp = sqrt($offX*$offX + $offY*$offY);
if ($hyp != 0) {
$scale = $this->_distanceFromEnd / $hyp;
} else {
$scale = 1;
}
$adX = $dX + $offX * $scale;
$adY = $dY + $offY * $scale;
if (is_object($this->_dataPreProcessor)) {
$labelText = $this->_dataPreProcessor->_process($value);
} else {
$labelText = $value;
}
if ((abs($dX - $centerX) < 1.5) && ($dY < $centerY)) {
$align = IMAGE_GRAPH_ALIGN_BOTTOM + IMAGE_GRAPH_ALIGN_CENTER_X;
} elseif ((abs($dX - $centerX) < 1.5) && ($dY > $centerY)) {
$align = IMAGE_GRAPH_ALIGN_TOP + IMAGE_GRAPH_ALIGN_CENTER_X;
} elseif ($dX < $centerX) {
$align = IMAGE_GRAPH_ALIGN_RIGHT + IMAGE_GRAPH_ALIGN_CENTER_Y;
} else {
$align = IMAGE_GRAPH_ALIGN_LEFT + IMAGE_GRAPH_ALIGN_CENTER_Y;
}
$this->write($adX, $adY, $labelText, $align);
$this->_getLineStyle();
$this->_canvas->line(array('x0' => $centerX, 'y0' => $centerY, 'x1' => $dX, 'y1' => $dY));
}
}
?>