/ui/obminclude/Artichow-1.1.0-php4+5/php5/LinePlot.class.php
https://github.com/goldoraf/OBM · PHP · 591 lines · 238 code · 117 blank · 236 comment · 18 complexity · d7b3db2efb2b792cc18114c9fbedfc18 MD5 · raw file
- <?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";
-
- /* <php4> */
- define("LINEPLOT_LINE", 0);
- define("LINEPLOT_MIDDLE", 1);
- /* </php4> */
- /**
- * 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');
- ?>