Subversion Repositories Applications.gtt

Rev

Rev 61 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/*
 * This work is hereby released into the Public Domain.
 * To view a copy of the public domain dedication,
 * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
 * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
 *
 */

require_once dirname(__FILE__)."/Plot.class.php";
 

/**
 * LinePlot
 *
 * @package Artichow
 */
class awLinePlot extends awPlot implements awLegendable {
        
        /**
         * Add marks to your line plot
         *
         * @var Mark
         */
        public $mark;
        
        /**
         * Labels on your line plot
         *
         * @var Label
         */
        public $label;
        
        /**
         * Filled areas
         *
         * @var bool
         */
        protected $areas = array();
        
        /**
         * Is the line hidden
         *
         * @var bool
         */
        protected $lineHide = FALSE;
        
        /**
         * Line color
         *
         * @var Color
         */
        protected $lineColor;
        
        /**
         * Line mode
         *
         * @var int
         */
        protected $lineMode = awLinePlot::LINE;
        
        /**
         * Line type
         *
         * @var int
         */
        protected $lineStyle = awLine::SOLID;
        
        /**
         * Line thickness
         *
         * @var int
         */
        protected $lineThickness = 1;
        
        /**
         * Line background
         *
         * @var Color, Gradient
         */
        protected $lineBackground;
        
        /**
         * Line mode
         *
         * @var int
         */
        const LINE = 0;
        
        /**
         * Line in the middle
         *
         * @var int
         */
        const MIDDLE = 1;
                
        /**
         * Construct a new awLinePlot
         *
         * @param array $values Some numeric values for Y axis
         * @param int $mode
         */
        public function __construct($values, $mode = awLinePlot::LINE) {
        
                parent::__construct();
                
                $this->mark = new awMark;
                $this->label = new awLabel;
                
                $this->lineMode = (int)$mode;
                
                $this->setValues($values);
        
        }
        
        /**
         * Hide line
         *
         * @param bool $hide
         */
        public function hideLine($hide) {
                $this->lineHide = (bool)$hide;
        }
        
        /**
         * Add a filled area
         *
         * @param int $start Begining of the area
         * @param int $end End of the area
         * @param mixed $background Background color or gradient of the area
         */
        public function setFilledArea($start, $stop, $background) {
        
                if($stop <= $start) {
                        awImage::drawError("Class LinePlot: End position can not be greater than begin position in setFilledArea().");
                }
        
                $this->areas[] = array((int)$start, (int)$stop, $background);
        
        }
        
        /**
         * Change line color
         *
         * @param awColor $color
         */
        public function setColor(awColor $color) {
                $this->lineColor = $color;
        }
        
        /**
         * Change line style
         *
         * @param int $style
         */
        public function setStyle($style) {
                $this->lineStyle = (int)$style;
        }
        
        /**
         * Change line tickness
         *
         * @param int $tickness
         */
        public function setThickness($tickness) {
                $this->lineThickness = (int)$tickness;
        }
        
        /**
         * Change line background color
         *
         * @param awColor $color
         */
        public function setFillColor(awColor $color) {
                $this->lineBackground = $color;
        }
        
        /**
         * Change line background gradient
         *
         * @param awGradient $gradient
         */
        public function setFillGradient(awGradient $gradient) {
                $this->lineBackground = $gradient;
        }

        /**
         * Get the line thickness
         *
         * @return int
         */
        public function getLegendLineThickness() {
                return $this->lineThickness;
        }

        /**
         * Get the line type
         *
         * @return int
         */
        public function getLegendLineStyle() {
                return $this->lineStyle;
        }

        /**
         * Get the color of line
         *
         * @return Color
         */
        public function getLegendLineColor() {
                return $this->lineColor;
        }

        /**
         * Get the background color or gradient of an element of the component
         *
         * @return Color, Gradient
         */
        public function getLegendBackground() {
                return $this->lineBackground;
        }

        /**
         * Get a mark object
         *
         * @return Mark
         */
        public function getLegendMark() {
                return $this->mark;
        }
        
        public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) {
                
                $max = $this->getRealYMax();
                $min = $this->getRealYMin();
                
                // Get start and stop values
                list($start, $stop) = $this->getLimit();
                
                if($this->lineMode === awLinePlot::MIDDLE) {
                        $inc = $this->xAxis->getDistance(0, 1) / 2;
                } else {
                        $inc = 0;
                }
                
                // Build the polygon
                $polygon = new awPolygon;
                
                for($key = $start; $key <= $stop; $key++) {
                
                        $value = $this->datay[$key];
                        
                        if($value !== NULL) {
                        
                                $p = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($key, $value));
                                $p = $p->move($inc, 0);
                                $polygon->set($key, $p);
                                
                        }
                
                }
                
                // Draw backgrounds
                if($this->lineBackground instanceof awColor or $this->lineBackground instanceof awGradient) {
                
                        $backgroundPolygon = new awPolygon;
                
                        $p = $this->xAxisPoint($start);
                        $p = $p->move($inc, 0);
                        $backgroundPolygon->append($p);
                        
                        // Add others points
                        foreach($polygon->all() as $point) {
                                $backgroundPolygon->append(clone $point);
                        }
                        
                        $p = $this->xAxisPoint($stop);
                        $p = $p->move($inc, 0);
                        $backgroundPolygon->append($p);
                
                        // Draw polygon background
                        $driver->filledPolygon($this->lineBackground, $backgroundPolygon);
                
                }
                
                $this->drawArea($driver, $polygon);
                
                // Draw line
                $prev = NULL;
                
                // Line color
                if($this->lineHide === FALSE) {
                
                        if($this->lineColor === NULL) {
                                $this->lineColor = new awColor(0, 0, 0);
                        }
                        
                        foreach($polygon->all() as $point) {
                        
                                if($prev !== NULL) {
                                        $driver->line(
                                                $this->lineColor,
                                                new awLine(
                                                        $prev,
                                                        $point,
                                                        $this->lineStyle,
                                                        $this->lineThickness
                                                )
                                        );
                                }
                                $prev = $point;
                                
                        }

                }
                
                // Draw marks and labels
                foreach($polygon->all() as $key => $point) {

                        $this->mark->draw($driver, $point);
                        $this->label->draw($driver, $point, $key);
                        
                }
                
        }
        
        protected function drawArea(awDriver $driver, awPolygon $polygon) {
        
                $starts = array();
                foreach($this->areas as $area) {
                        list($start) = $area;
                        $starts[$start] = TRUE;
                }
                
                // Draw filled areas
                foreach($this->areas as $area) {
                
                        list($start, $stop, $background) = $area;
                        
                        $polygonArea = new awPolygon;
                        
                        $p = $this->xAxisPoint($start);
                        $polygonArea->append($p);
                        
                        for($i = $start; $i <= $stop; $i++) {
                                $p = clone $polygon->get($i);
                                if($i === $stop and array_key_exists($stop, $starts)) {
                                        $p = $p->move(-1, 0);
                                }
                                $polygonArea->append($p);
                        }
                        
                        $p = $this->xAxisPoint($stop);
                        if(array_key_exists($stop, $starts)) {
                                $p = $p->move(-1, 0);
                        }
                        $polygonArea->append($p);
                
                        // Draw area
                        $driver->filledPolygon($background, $polygonArea);
                
                }
                
        }
        
        public function getXAxisNumber() {
                if($this->lineMode === awLinePlot::MIDDLE) {
                        return count($this->datay) + 1;
                } else {
                        return count($this->datay);
                }
        }
        
        protected function xAxisPoint($position) {
                $y = $this->xAxisZero ? 0 : $this->getRealYMin();
                return awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($position, $y));
        }
        
        public function getXCenter() {
                return ($this->lineMode === awLinePlot::MIDDLE);
        }

}

registerClass('LinePlot');


/**
 * Simple LinePlot
 * Useful to draw simple horizontal lines
 *
 * @package Artichow
 */
class awSimpleLinePlot extends awPlot implements awLegendable {
        
        /**
         * Line color
         *
         * @var Color
         */
        protected $lineColor;
        
        /**
         * Line start
         *
         * @var int
         */
        protected $lineStart;
        
        /**
         * Line stop
         *
         * @var int
         */
        protected $lineStop;
        
        /**
         * Line value
         *
         * @var flaot
         */
        protected $lineValue;
        
        /**
         * Line mode
         *
         * @var int
         */
        protected $lineMode = awLinePlot::LINE;
        
        /**
         * Line type
         *
         * @var int
         */
        protected $lineStyle = awLine::SOLID;
        
        /**
         * Line thickness
         *
         * @var int
         */
        protected $lineThickness = 1;
        
        /**
         * Line mode
         *
         * @var int
         */
        const LINE = 0;
        
        /**
         * Line in the middle
         *
         * @var int
         */
        const MIDDLE = 1;
                
        /**
         * Construct a new awLinePlot
         *
         * @param float $value A Y value
         * @param int $start Line start index
         * @param int $stop Line stop index
         * @param int $mode Line mode
         */
        public function __construct($value, $start, $stop, $mode = awLinePlot::LINE) {
        
                parent::__construct();
                
                $this->lineMode = (int)$mode;
                
                $this->lineStart = (int)$start;
                $this->lineStop = (int)$stop;
                $this->lineValue = (float)$value;
                
                $this->lineColor = new awColor(0, 0, 0);
        
        }
        
        /**
         * Change line color
         *
         * @param awColor $color
         */
        public function setColor(awColor $color) {
                $this->lineColor = $color;
        }
        
        /**
         * Change line style
         *
         * @param int $style
         */
        public function setStyle($style) {
                $this->lineStyle = (int)$style;
        }
        
        /**
         * Change line tickness
         *
         * @param int $tickness
         */
        public function setThickness($tickness) {
                $this->lineThickness = (int)$tickness;
        }

        /**
         * Get the line thickness
         *
         * @return int
         */
        public function getLegendLineThickness() {
                return $this->lineThickness;
        }

        /**
         * Get the line type
         *
         * @return int
         */
        public function getLegendLineStyle() {
                return $this->lineStyle;
        }

        /**
         * Get the color of line
         *
         * @return Color
         */
        public function getLegendLineColor() {
                return $this->lineColor;
        }

        public function getLegendBackground() {
                return NULL;
        }

        public function getLegendMark() {
                return NULL;
        }
        
        public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) {
                
                if($this->lineMode === awLinePlot::MIDDLE) {
                        $inc = $this->xAxis->getDistance(0, 1) / 2;
                } else {
                        $inc = 0;
                }
                
                $p1 = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($this->lineStart, $this->lineValue));
                $p2 = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($this->lineStop, $this->lineValue));
                
                $driver->line(
                        $this->lineColor,
                        new awLine(
                                $p1->move($inc, 0),
                                $p2->move($inc, 0),
                                $this->lineStyle,
                                $this->lineThickness
                        )
                );
}
        
        public function getXAxisNumber() {
                if($this->lineMode === awLinePlot::MIDDLE) {
                        return count($this->datay) + 1;
                } else {
                        return count($this->datay);
                }
        }
        
        protected function xAxisPoint($position) {
                $y = $this->xAxisZero ? 0 : $this->getRealYMin();
                return awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($position, $y));
        }
        
        public function getXCenter() {
                return ($this->lineMode === awLinePlot::MIDDLE);
        }

}

registerClass('SimpleLinePlot');
?>