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');