| 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 |