<?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));
    }

}

?>