New file |
0,0 → 1,344 |
<?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__)."/../Graph.class.php"; |
|
|
/** |
* Handle ticks |
* |
* @package Artichow |
*/ |
class awTick { |
|
/** |
* Ticks style |
* |
* @var int |
*/ |
protected $style = awTick::IN; |
|
/** |
* Ticks size |
* |
* @var int |
*/ |
protected $size; |
|
/** |
* Ticks color |
* |
* @var Color |
*/ |
protected $color; |
|
/** |
* Ticks number |
* |
* @var int |
*/ |
protected $number; |
|
/** |
* Ticks number by other tick |
* |
* @var array |
*/ |
protected $numberByTick; |
|
/** |
* Ticks interval |
* |
* @var int |
*/ |
protected $interval = 1; |
|
/** |
* Hide ticks |
* |
* @var bool |
*/ |
protected $hide = FALSE; |
|
/** |
* Hide first tick |
* |
* @var bool |
*/ |
protected $hideFirst = FALSE; |
|
/** |
* Hide last tick |
* |
* @var bool |
*/ |
protected $hideLast = FALSE; |
|
/** |
* In mode |
* |
* @param int |
*/ |
const IN = 0; |
|
/** |
* Out mode |
* |
* @param int |
*/ |
const OUT = 1; |
|
/** |
* In and out mode |
* |
* @param int |
*/ |
const IN_OUT = 2; |
|
/** |
* Build the ticks |
* |
* @param int $number Number of ticks |
* @param int $size Ticks size |
*/ |
public function __construct($number, $size) { |
|
$this->setSize($size); |
$this->setNumber($number); |
$this->setColor(new awBlack); |
$this->style = awTick::IN; |
|
} |
|
/** |
* Change ticks style |
* |
* @param int $style |
*/ |
public function setStyle($style) { |
$this->style = (int)$style; |
} |
|
/** |
* Get ticks style |
* |
* @return int |
*/ |
public function getStyle() { |
return $this->style; |
} |
|
/** |
* Change ticks color |
* |
* @param awColor $color |
*/ |
public function setColor(awColor $color) { |
$this->color = $color; |
} |
|
/** |
* Change ticks size |
* |
* @param int $size |
*/ |
public function setSize($size) { |
$this->size = (int)$size; |
} |
|
/** |
* Change interval of ticks |
* |
* @param int $interval |
*/ |
public function setInterval($interval) { |
$this->interval = (int)$interval; |
} |
|
/** |
* Get interval between each tick |
* |
* @return int |
*/ |
public function getInterval() { |
return $this->interval; |
} |
|
/** |
* Change number of ticks |
* |
* @param int $number |
*/ |
public function setNumber($number) { |
$this->number = (int)$number; |
} |
|
/** |
* Get number of ticks |
* |
* @return int |
*/ |
public function getNumber() { |
return $this->number; |
} |
|
/** |
* Change number of ticks relative to others ticks |
* |
* @param awTick $tick Ticks reference |
* @param int $number Number of ticks |
*/ |
public function setNumberByTick(awTick $tick, $number) { |
|
$this->numberByTick = array($tick, (int)$number); |
|
} |
|
/** |
* Hide ticks |
* |
* @param bool $hide |
*/ |
public function hide($hide) { |
$this->hide = (bool)$hide; |
} |
|
/** |
* Hide first tick |
* |
* @param bool $hide |
*/ |
public function hideFirst($hide) { |
$this->hideFirst = (bool)$hide; |
} |
|
/** |
* Hide last tick |
* |
* @param bool $hide |
*/ |
public function hideLast($hide) { |
$this->hideLast = (bool)$hide; |
} |
|
/** |
* Draw ticks on a vector |
* |
* @param awDriver $driver A driver |
* @param awVector $vector A vector |
*/ |
public function draw(awDriver $driver, awVector $vector) { |
|
if($this->numberByTick !== NULL) { |
list($tick, $number) = $this->numberByTick; |
$this->number = 1 + ($tick->getNumber() - 1) * ($number + 1); |
$this->interval = $tick->getInterval(); |
} |
|
if($this->number < 2 or $this->hide) { |
return; |
} |
|
$angle = $vector->getAngle(); |
// echo "INIT:".$angle."<br>"; |
switch($this->style) { |
|
case awTick::IN : |
$this->drawTicks($driver, $vector, NULL, $angle + M_PI / 2); |
break; |
|
case awTick::OUT : |
$this->drawTicks($driver, $vector, $angle + 3 * M_PI / 2, NULL); |
break; |
|
default : |
$this->drawTicks($driver, $vector, $angle + M_PI / 2, $angle + 3 * M_PI / 2); |
break; |
|
} |
|
} |
|
protected function drawTicks(awDriver $driver, awVector $vector, $from, $to) { |
|
// Draw last tick |
if($this->hideLast === FALSE) { |
|
//echo '<b>'; |
if(($this->number - 1) % $this->interval === 0) { |
$this->drawTick($driver, $vector->p2, $from, $to); |
} |
//echo '</b>'; |
|
} |
|
$number = $this->number - 1; |
$size = $vector->getSize(); |
|
// Get tick increment in pixels |
$inc = $size / $number; |
|
// Check if we must hide the first tick |
$start = $this->hideFirst ? $inc : 0; |
$stop = $inc * $number; |
|
$position = 0; |
|
for($i = $start; round($i, 6) < $stop; $i += $inc) { |
|
if($position % $this->interval === 0) { |
$p = $vector->p1->move( |
round($i * cos($vector->getAngle()), 6), |
round($i * sin($vector->getAngle() * -1), 6) |
); |
$this->drawTick($driver, $p, $from, $to); |
} |
|
$position++; |
|
} |
//echo '<br><br>'; |
} |
|
protected function drawTick(awDriver $driver, awPoint $p, $from, $to) { |
// echo $this->size.':'.$angle.'|<b>'.cos($angle).'</b>/'; |
// The round avoid some errors in the calcul |
// For example, 12.00000008575245 becomes 12 |
$p1 = $p; |
$p2 = $p; |
|
if($from !== NULL) { |
$p1 = $p1->move( |
round($this->size * cos($from), 6), |
round($this->size * sin($from) * -1, 6) |
); |
} |
|
if($to !== NULL) { |
$p2 = $p2->move( |
round($this->size * cos($to), 6), |
round($this->size * sin($to) * -1, 6) |
); |
} |
//echo $p1->x.':'.$p2->x.'('.$p1->y.':'.$p2->y.')'.'/'; |
$vector = new awVector( |
$p1, $p2 |
); |
|
$driver->line( |
$this->color, |
$vector |
); |
|
} |
|
} |
|
registerClass('Tick'); |
?> |