OLD | NEW |
1 // | 1 // |
2 // Copyright 2014 Google Inc. All rights reserved. | 2 // Copyright 2014 Google Inc. All rights reserved. |
3 // | 3 // |
4 // Use of this source code is governed by a BSD-style | 4 // Use of this source code is governed by a BSD-style |
5 // license that can be found in the LICENSE file or at | 5 // license that can be found in the LICENSE file or at |
6 // https://developers.google.com/open-source/licenses/bsd | 6 // https://developers.google.com/open-source/licenses/bsd |
7 // | 7 // |
8 part of charted.core.scales; | 8 part of charted.core.scales; |
9 | 9 |
10 /// Log scale is similar to linear scale, except there's a logarithmic | 10 /// Log scale is similar to linear scale, except there's a logarithmic |
11 /// transform that is applied to the input domain value before the output | 11 /// transform that is applied to the input domain value before the output |
12 /// range value is computed. | 12 /// range value is computed. |
13 /// | 13 /// |
14 /// The mapping to the output range value y can be expressed as a function | 14 /// The mapping to the output range value y can be expressed as a function |
15 /// of the input domain value x: y = m log(x) + b. | 15 /// of the input domain value x: y = m log(x) + b. |
16 /// | 16 /// |
17 /// As log(0) is negative infinity, a log scale must have either an | 17 /// As log(0) is negative infinity, a log scale must have either an |
18 /// exclusively-positive or exclusively-negative domain; the domain must not | 18 /// exclusively-positive or exclusively-negative domain; the domain must not |
19 /// include or cross zero. | 19 /// include or cross zero. |
20 class LogScale implements Scale { | 20 class LogScale implements Scale { |
21 static const defaultBase = 10; | 21 static const defaultBase = 10; |
22 static const defaultDomain = const [1, 10]; | 22 static const defaultDomain = const [1, 10]; |
23 static final negativeNumbersRoundFunctionsPair = | 23 static final negativeNumbersRoundFunctionsPair = |
24 new RoundingFunctions( | 24 new RoundingFunctions((x) => -((-x).floor()), (x) => -((-x).ceil())); |
25 (x) => -((-x).floor()), | |
26 (x) => -((-x).ceil())); | |
27 | 25 |
28 final LinearScale _linear; | 26 final LinearScale _linear; |
29 | 27 |
30 bool _nice = false; | 28 bool _nice = false; |
31 int _base = defaultBase; | 29 int _base = defaultBase; |
32 int _ticksCount = 10; | 30 int _ticksCount = 10; |
33 bool _positive = true; | 31 bool _positive = true; |
34 List _domain = defaultDomain; | 32 List _domain = defaultDomain; |
35 | 33 |
36 LogScale() : _linear = new LinearScale(); | 34 LogScale() : _linear = new LinearScale(); |
37 | 35 |
38 LogScale._clone(LogScale source) | 36 LogScale._clone(LogScale source) |
39 : _linear = source._linear.clone(), | 37 : _linear = source._linear.clone(), |
40 _domain = source._domain.toList(), | 38 _domain = source._domain.toList(), |
41 _positive = source._positive, | 39 _positive = source._positive, |
42 _base = source._base, | 40 _base = source._base, |
43 _nice = source._nice, | 41 _nice = source._nice, |
44 _ticksCount = source._ticksCount; | 42 _ticksCount = source._ticksCount; |
45 | 43 |
46 num _log(x) => (_positive ? | 44 num _log(x) => |
47 math.log(x < 0 ? 0 : x) : -math.log(x > 0 ? 0 : -x)) / math.log(base); | 45 (_positive ? math.log(x < 0 ? 0 : x) : -math.log(x > 0 ? 0 : -x)) / |
| 46 math.log(base); |
48 | 47 |
49 num _pow(x) => _positive ? math.pow(base, x) : -math.pow(base, -x); | 48 num _pow(x) => _positive ? math.pow(base, x) : -math.pow(base, -x); |
50 | 49 |
51 set base(int value) { | 50 set base(int value) { |
52 if (_base != value) { | 51 if (_base != value) { |
53 _base = value; | 52 _base = value; |
54 _reset(); | 53 _reset(); |
55 } | 54 } |
56 } | 55 } |
57 | 56 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 return d / _pow((_log(d) + e).ceil()) <= k ? logFormatFunction(d) : ''; | 170 return d / _pow((_log(d) + e).ceil()) <= k ? logFormatFunction(d) : ''; |
172 } else { | 171 } else { |
173 return d / _pow((_log(d) + e).floor()) <= k ? logFormatFunction(d) : ''; | 172 return d / _pow((_log(d) + e).floor()) <= k ? logFormatFunction(d) : ''; |
174 } | 173 } |
175 }; | 174 }; |
176 } | 175 } |
177 | 176 |
178 @override | 177 @override |
179 LogScale clone() => new LogScale._clone(this); | 178 LogScale clone() => new LogScale._clone(this); |
180 } | 179 } |
OLD | NEW |