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 class LinearScale implements Scale { | 10 class LinearScale implements Scale { |
(...skipping 22 matching lines...) Expand all Loading... |
33 _rounded = source._rounded { | 33 _rounded = source._rounded { |
34 _reset(); | 34 _reset(); |
35 } | 35 } |
36 | 36 |
37 void _reset({bool nice: false}) { | 37 void _reset({bool nice: false}) { |
38 if (nice) { | 38 if (nice) { |
39 _domain = ScaleUtils.nice( | 39 _domain = ScaleUtils.nice( |
40 _domain, ScaleUtils.niceStep(_linearTickRange().step)); | 40 _domain, ScaleUtils.niceStep(_linearTickRange().step)); |
41 } | 41 } |
42 | 42 |
43 Function linear = math.min(_domain.length, _range.length) > 2 ? | 43 Function linear = math.min(_domain.length, _range.length) > 2 |
44 ScaleUtils.polylinearScale : ScaleUtils.bilinearScale; | 44 ? ScaleUtils.polylinearScale |
| 45 : ScaleUtils.bilinearScale; |
45 | 46 |
46 Function uninterpolator = clamp ? uninterpolateClamp : uninterpolateNumber; | 47 Function uninterpolator = clamp ? uninterpolateClamp : uninterpolateNumber; |
47 InterpolatorGenerator interpolator = | 48 InterpolatorGenerator interpolator = |
48 _rounded ? createRoundedNumberInterpolator : createNumberInterpolator; | 49 _rounded ? createRoundedNumberInterpolator : createNumberInterpolator; |
49 | 50 |
50 _invert = | 51 _invert = linear(_range, _domain, uninterpolator, createNumberInterpolator); |
51 linear(_range, _domain, uninterpolator, createNumberInterpolator); | |
52 _scale = linear(_domain, _range, uninterpolator, interpolator); | 52 _scale = linear(_domain, _range, uninterpolator, interpolator); |
53 } | 53 } |
54 | 54 |
55 @override | 55 @override |
56 set range(Iterable value) { | 56 set range(Iterable value) { |
57 assert(value != null); | 57 assert(value != null); |
58 _range = value; | 58 _range = value; |
59 _reset(); | 59 _reset(); |
60 } | 60 } |
61 | 61 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 @override | 128 @override |
129 num scale(num value) => _scale(value); | 129 num scale(num value) => _scale(value); |
130 | 130 |
131 @override | 131 @override |
132 num invert(num value) => _invert(value); | 132 num invert(num value) => _invert(value); |
133 | 133 |
134 Range _linearTickRange([Extent extent]) { | 134 Range _linearTickRange([Extent extent]) { |
135 if (extent == null) { | 135 if (extent == null) { |
136 extent = ScaleUtils.extent(_domain); | 136 extent = ScaleUtils.extent(_domain); |
137 } | 137 } |
138 var span = extent.max - extent.min, | 138 var span = extent.max - extent.min; |
139 step = | 139 if (span == 0) { |
140 math.pow(10, (math.log(span / _ticksCount) / math.LN10).floor()), | 140 span = 1.0; // [span / _ticksCount] should never be equal zero. |
141 err = _ticksCount / span * step; | 141 } |
| 142 var step = math.pow(10, (math.log(span / _ticksCount) / math.LN10).floor()); |
| 143 var err = _ticksCount / span * step; |
142 | 144 |
143 // Filter ticks to get closer to the desired count. | 145 // Filter ticks to get closer to the desired count. |
144 if (err <= .15) { | 146 if (err <= .15) { |
145 step *= 10; | 147 step *= 10; |
146 } | 148 } else if (err <= .35) { |
147 else if (err <= .35) { | |
148 step *= 5; | 149 step *= 5; |
149 } | 150 } else if (err <= .75) { |
150 else if (err <= .75) { | |
151 step *= 2; | 151 step *= 2; |
152 } | 152 } |
153 | 153 |
154 return new Range((extent.min / step).ceil() * step, | 154 return new Range((extent.min / step).ceil() * step, |
155 (extent.max / step).floor() * step + step * 0.5, step); | 155 (extent.max / step).floor() * step + step * 0.5, step); |
156 } | 156 } |
157 | 157 |
158 @override | 158 @override |
159 FormatFunction createTickFormatter([String formatStr]) { | 159 FormatFunction createTickFormatter([String formatStr]) { |
160 int precision(value) { | 160 int precision(value) { |
161 return -(math.log(value) / math.LN10 + .01).floor(); | 161 return -(math.log(value) / math.LN10 + .01).floor(); |
162 } | 162 } |
163 Range tickRange = _linearTickRange(); | 163 Range tickRange = _linearTickRange(); |
164 if (formatStr == null) { | 164 if (formatStr == null) { |
165 formatStr = ".${precision(tickRange.step)}f"; | 165 formatStr = ".${precision(tickRange.step)}f"; |
166 } | 166 } |
167 NumberFormat formatter = new NumberFormat(new EnUsLocale()); | 167 NumberFormat formatter = new NumberFormat(new EnUsLocale()); |
168 return formatter.format(formatStr); | 168 return formatter.format(formatStr); |
169 } | 169 } |
170 | 170 |
171 @override | 171 @override |
172 LinearScale clone() => new LinearScale._clone(this); | 172 LinearScale clone() => new LinearScale._clone(this); |
173 } | 173 } |
OLD | NEW |