Subversion Repositories Applications.gtt

Rev

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

Rev Author Line No. Line
60 jpm 1
<?php
2
/*
3
 * This work is hereby released into the Public Domain.
4
 * To view a copy of the public domain dedication,
5
 * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
6
 * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
7
 *
8
 */
9
 
10
require_once dirname(__FILE__)."/../Graph.class.php";
11
 
12
 
13
/**
14
 * Handle ticks
15
 *
16
 * @package Artichow
17
 */
18
class awTick {
19
 
20
	/**
21
	 * Ticks style
22
	 *
23
	 * @var int
24
	 */
25
	protected $style = awTick::IN;
26
 
27
	/**
28
	 * Ticks size
29
	 *
30
	 * @var int
31
	 */
32
	protected $size;
33
 
34
	/**
35
	 * Ticks color
36
	 *
37
	 * @var Color
38
	 */
39
	protected $color;
40
 
41
	/**
42
	 * Ticks number
43
	 *
44
	 * @var int
45
	 */
46
	protected $number;
47
 
48
	/**
49
	 * Ticks number by other tick
50
	 *
51
	 * @var array
52
	 */
53
	protected $numberByTick;
54
 
55
	/**
56
	 * Ticks interval
57
	 *
58
	 * @var int
59
	 */
60
	protected $interval = 1;
61
 
62
	/**
63
	 * Hide ticks
64
	 *
65
	 * @var bool
66
	 */
67
	protected $hide = FALSE;
68
 
69
	/**
70
	 * Hide first tick
71
	 *
72
	 * @var bool
73
	 */
74
	protected $hideFirst = FALSE;
75
 
76
	/**
77
	 * Hide last tick
78
	 *
79
	 * @var bool
80
	 */
81
	protected $hideLast = FALSE;
82
 
83
	/**
84
	 * In mode
85
	 *
86
	 * @param int
87
	 */
88
	const IN = 0;
89
 
90
	/**
91
	 * Out mode
92
	 *
93
	 * @param int
94
	 */
95
	const OUT = 1;
96
 
97
	/**
98
	 * In and out mode
99
	 *
100
	 * @param int
101
	 */
102
	const IN_OUT = 2;
103
 
104
	/**
105
	 * Build the ticks
106
	 *
107
	 * @param int $number Number of ticks
108
	 * @param int $size Ticks size
109
	 */
110
	public function __construct($number, $size) {
111
 
112
		$this->setSize($size);
113
		$this->setNumber($number);
114
		$this->setColor(new awBlack);
115
		$this->style = awTick::IN;
116
 
117
	}
118
 
119
	/**
120
	 * Change ticks style
121
	 *
122
	 * @param int $style
123
	 */
124
	public function setStyle($style) {
125
		$this->style = (int)$style;
126
	}
127
 
128
	/**
129
	 * Get ticks style
130
	 *
131
	 * @return int
132
	 */
133
	public function getStyle() {
134
		return $this->style;
135
	}
136
 
137
	/**
138
	 * Change ticks color
139
	 *
140
	 * @param awColor $color
141
	 */
142
	public function setColor(awColor $color) {
143
		$this->color = $color;
144
	}
145
 
146
	/**
147
	 * Change ticks size
148
	 *
149
	 * @param int $size
150
	 */
151
	public function setSize($size) {
152
		$this->size = (int)$size;
153
	}
154
 
155
	/**
156
	 * Change interval of ticks
157
	 *
158
	 * @param int $interval
159
	 */
160
	public function setInterval($interval) {
161
		$this->interval = (int)$interval;
162
	}
163
 
164
	/**
165
	 * Get interval between each tick
166
	 *
167
	 * @return int
168
	 */
169
	public function getInterval() {
170
		return $this->interval;
171
	}
172
 
173
	/**
174
	 * Change number of ticks
175
	 *
176
	 * @param int $number
177
	 */
178
	public function setNumber($number) {
179
		$this->number = (int)$number;
180
	}
181
 
182
	/**
183
	 * Get number of ticks
184
	 *
185
	 * @return int
186
	 */
187
	public function getNumber() {
188
		return $this->number;
189
	}
190
 
191
	/**
192
	 * Change number of ticks relative to others ticks
193
	 *
194
	 * @param awTick $tick Ticks reference
195
	 * @param int $number Number of ticks
196
	 */
197
	public function setNumberByTick(awTick $tick, $number) {
198
 
199
		$this->numberByTick = array($tick, (int)$number);
200
 
201
			}
202
 
203
	/**
204
	 * Hide ticks
205
	 *
206
	 * @param bool $hide
207
	 */
208
	public function hide($hide) {
209
		$this->hide = (bool)$hide;
210
	}
211
 
212
	/**
213
	 * Hide first tick
214
	 *
215
	 * @param bool $hide
216
	 */
217
	public function hideFirst($hide) {
218
		$this->hideFirst = (bool)$hide;
219
	}
220
 
221
	/**
222
	 * Hide last tick
223
	 *
224
	 * @param bool $hide
225
	 */
226
	public function hideLast($hide) {
227
		$this->hideLast = (bool)$hide;
228
	}
229
 
230
	/**
231
	 * Draw ticks on a vector
232
	 *
233
	 * @param awDriver $driver A driver
234
	 * @param awVector $vector A vector
235
	 */
236
	public function draw(awDriver $driver, awVector $vector) {
237
 
238
		if($this->numberByTick !== NULL) {
239
			list($tick, $number) = $this->numberByTick;
240
			$this->number = 1 + ($tick->getNumber() - 1) * ($number + 1);
241
			$this->interval = $tick->getInterval();
242
		}
243
 
244
		if($this->number < 2 or $this->hide) {
245
			return;
246
		}
247
 
248
		$angle = $vector->getAngle();
249
	//	echo "INIT:".$angle."<br>";
250
		switch($this->style) {
251
 
252
			case awTick::IN :
253
				$this->drawTicks($driver, $vector, NULL, $angle + M_PI / 2);
254
				break;
255
 
256
			case awTick::OUT :
257
				$this->drawTicks($driver, $vector, $angle + 3 * M_PI / 2, NULL);
258
				break;
259
 
260
			default :
261
				$this->drawTicks($driver, $vector, $angle + M_PI / 2, $angle + 3 * M_PI / 2);
262
				break;
263
 
264
		}
265
 
266
	}
267
 
268
	protected function drawTicks(awDriver $driver, awVector $vector, $from, $to) {
269
 
270
		// Draw last tick
271
		if($this->hideLast === FALSE) {
272
 
273
			//echo '<b>';
274
			if(($this->number - 1) % $this->interval === 0) {
275
				$this->drawTick($driver, $vector->p2, $from, $to);
276
			}
277
			//echo '</b>';
278
 
279
		}
280
 
281
		$number = $this->number - 1;
282
		$size = $vector->getSize();
283
 
284
		// Get tick increment in pixels
285
		$inc = $size / $number;
286
 
287
		// Check if we must hide the first tick
288
		$start = $this->hideFirst ? $inc : 0;
289
		$stop = $inc * $number;
290
 
291
		$position = 0;
292
 
293
		for($i = $start; round($i, 6) < $stop; $i += $inc) {
294
 
295
			if($position % $this->interval === 0) {
296
				$p = $vector->p1->move(
297
					round($i * cos($vector->getAngle()), 6),
298
					round($i * sin($vector->getAngle() * -1), 6)
299
				);
300
				$this->drawTick($driver, $p, $from, $to);
301
			}
302
 
303
			$position++;
304
 
305
		}
306
		//echo '<br><br>';
307
	}
308
 
309
	protected function drawTick(awDriver $driver, awPoint $p, $from, $to) {
310
//	echo $this->size.':'.$angle.'|<b>'.cos($angle).'</b>/';
311
		// The round avoid some errors in the calcul
312
		// For example, 12.00000008575245 becomes 12
313
		$p1 = $p;
314
		$p2 = $p;
315
 
316
		if($from !== NULL) {
317
			$p1 = $p1->move(
318
				round($this->size * cos($from), 6),
319
				round($this->size * sin($from) * -1, 6)
320
			);
321
		}
322
 
323
		if($to !== NULL) {
324
			$p2 = $p2->move(
325
				round($this->size * cos($to), 6),
326
				round($this->size * sin($to) * -1, 6)
327
			);
328
		}
329
		//echo $p1->x.':'.$p2->x.'('.$p1->y.':'.$p2->y.')'.'/';
330
		$vector = new awVector(
331
			$p1, $p2
332
		);
333
 
334
		$driver->line(
335
			$this->color,
336
			$vector
337
		);
338
 
339
	}
340
 
341
}
342
 
343
registerClass('Tick');
344
?>