Rev 60 | Go to most recent revision | 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 valueslist($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 backgroundsif($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 pointsforeach($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 colorif($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 labelsforeach($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 areasforeach($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');?>