Index: charted/lib/core/scales.dart |
diff --git a/charted/lib/core/scales.dart b/charted/lib/core/scales.dart |
deleted file mode 100644 |
index 4acd744f0506872189d4d0e74229412fe9616dea..0000000000000000000000000000000000000000 |
--- a/charted/lib/core/scales.dart |
+++ /dev/null |
@@ -1,234 +0,0 @@ |
-// |
-// Copyright 2014 Google Inc. All rights reserved. |
-// |
-// Use of this source code is governed by a BSD-style |
-// license that can be found in the LICENSE file or at |
-// https://developers.google.com/open-source/licenses/bsd |
-// |
- |
-/// Collection of scales for use by charts. The role of scales is to map the |
-/// input domain to an output range. |
-/// |
-/// Charted supports two types of scales: |
-/// - Quantitative, where the scales use a mathematical function for mapping |
-/// the input domain to output range. |
-/// - Ordinal, where the input domain is discrete (i.e set of values) |
-/// |
-library charted.core.scales; |
- |
-import 'dart:math' as math; |
-import 'package:charted/core/utils.dart'; |
-import 'package:charted/core/interpolators.dart'; |
-import 'package:charted/core/time_interval.dart'; |
-import 'package:charted/locale/locale.dart'; |
-import 'package:charted/locale/format.dart'; |
- |
-part 'scales/ordinal_scale.dart'; |
-part 'scales/linear_scale.dart'; |
-part 'scales/log_scale.dart'; |
-part 'scales/time_scale.dart'; |
- |
-typedef num RoundFunction(num value); |
- |
-/// Minimum common interface supported by all scales. [QuantitativeScale] and |
-/// [OrdinalScale] contain the interface for their respective types. |
-abstract class Scale { |
- /// Given a [value] in the input domain, map it to the range. |
- /// On [QuantitativeScale]s both parameter and return values are numbers. |
- dynamic scale(value); |
- |
- /// Given a [value] in the output range, return value in the input domain |
- /// that maps to the value. |
- /// On [QuantitativeScale]s both parameter and return values are numbers. |
- dynamic invert(value); |
- |
- /// Input domain used by this scale. |
- Iterable domain; |
- |
- /// Output range used by this scale. |
- Iterable range; |
- |
- /// Maximum and minimum values of the scale's output range. |
- Extent get rangeExtent; |
- |
- /// Creates tick values over the input domain. |
- Iterable get ticks; |
- |
- /// Creates a formatter that is suitable for formatting the ticks. |
- /// For ordinal scale, the returned function is an identity function. |
- FormatFunction createTickFormatter([String format]); |
- |
- /// Creates a clone of this scale. |
- Scale clone(); |
- |
- /// Suggested number of ticks on this scale. |
- /// Note: This property is only valid on quantitative scales. |
- int ticksCount; |
- |
- /// Indicates if the current scale is using niced values for ticks. |
- /// Note: This property is only valid on quantitative scales. |
- bool nice; |
- |
- /// Indicates if output range is clamped. When clamp is not true, any input |
- /// value that is not within the input domain may result in a value that is |
- /// outside the output range. |
- /// Note: This property is only valid on quantitative scales. |
- bool clamp; |
- |
- /// Indicates that the scaled values must be rounded to the nearest |
- /// integer. Helps avoid anti-aliasing artifacts in the visualizations. |
- /// Note: This property is only valid on quantitative scales. |
- bool rounded; |
-} |
- |
-/// Minimum common interface supported by scales whose input domain |
-/// contains discreet values (Ordinal scales). |
-abstract class OrdinalScale extends Scale { |
- factory OrdinalScale() = _OrdinalScale; |
- |
- /// Amount of space that each value in the domain gets from the range. A band |
- /// is available only after [rangeBands] or [rangeRoundBands] is called by |
- /// the user. A bar-chart could use this space as width of a bar. |
- num get rangeBand; |
- |
- /// Maps each value on the domain to a single point on output range. When a |
- /// non-zero value is specified, [padding] space is left unused on both ends |
- /// of the range. |
- void rangePoints(Iterable range, [double padding]); |
- |
- /// Maps each value on the domain to a band in the output range. When a |
- /// non-zero value is specified, [padding] space is left between each bands |
- /// and [outerPadding] space is left unused at both ends of the range. |
- void rangeBands(Iterable range, [double padding, double outerPadding]); |
- |
- /// Similar to [rangeBands] but ensures that each band starts and ends on a |
- /// pixel boundary - helps avoid anti-aliasing artifacts. |
- void rangeRoundBands(Iterable range, [double padding, double outerPadding]); |
-} |
- |
-class RoundingFunctions extends Pair<RoundFunction,RoundFunction> { |
- RoundingFunctions(RoundFunction floor, RoundFunction ceil) |
- : super(floor, ceil); |
- |
- factory RoundingFunctions.defaults() => |
- new RoundingFunctions((x) => x.floor(), (x) => x.ceil()); |
- |
- factory RoundingFunctions.identity() => |
- new RoundingFunctions(identityFunction, identityFunction); |
- |
- RoundFunction get floor => super.first; |
- RoundFunction get ceil => super.last; |
-} |
- |
-/// Namespacing container for utilities used by scales. |
-abstract class ScaleUtils { |
- /// Utility to return extent of sorted [values]. |
- static Extent extent(Iterable values) => |
- values.first < values.last |
- ? new Extent(values.first, values.last) |
- : new Extent(values.last, values.first); |
- |
- /// Extends [values] to round numbers based on the given pair of |
- /// floor and ceil functions. [functions] is a pair of rounding function |
- /// among which the first is used to compute floor of a number and the |
- /// second for ceil of the number. |
- static List nice(List values, RoundingFunctions functions) { |
- if (values.last >= values.first) { |
- values[0] = functions.floor(values.first); |
- values[values.length - 1] = functions.ceil(values.last); |
- } else { |
- values[values.length - 1] = functions.floor(values.last); |
- values[0] = functions.ceil(values.first); |
- } |
- return values; |
- } |
- |
- static RoundingFunctions niceStep(num step) => (step > 0) |
- ? new RoundingFunctions( |
- (x) => (x < step) ? x.floor() : (x / step).floor() * step, |
- (x) => (x < step) ? x.ceil() : (x / step).ceil() * step) |
- : new RoundingFunctions.identity(); |
- |
- /// Returns a Function that given a value x on the domain, returns the |
- /// corresponding value on the range on a bilinear scale. |
- /// |
- /// @param domain The domain of the scale. |
- /// @param range The range of the scale. |
- /// @param uninterpolator The uninterpolator for domain values. |
- /// @param interpolator The interpolator for range values. |
- static Function bilinearScale(List domain, List range, |
- Function uninterpolator, Function interpolator) { |
- var u = uninterpolator(domain[0], domain[1]), |
- i = interpolator(range[0], range[1]); |
- return (x) => i(u(x)); |
- } |
- |
- /// Returns a Function that given a value x on the domain, returns the |
- /// corresponding value on the range on a polylinear scale. |
- /// |
- /// @param domain The domain of the scale. |
- /// @param range The range of the scale. |
- /// @param uninterpolator The uninterpolator for domain values. |
- /// @param interpolator The interpolator for range values. |
- static Function polylinearScale(List domain, List range, |
- Function uninterpolator, Function interpolator) { |
- var u = [], |
- i = [], |
- j = 0, |
- k = math.min(domain.length, range.length) - 1; |
- |
- // Handle descending domains. |
- if (domain[k] < domain[0]) { |
- domain = domain.reversed.toList(); |
- range = range.reversed.toList(); |
- } |
- |
- while (++j <= k) { |
- u.add(uninterpolator(domain[j - 1], domain[j])); |
- i.add(interpolator(range[j - 1], range[j])); |
- } |
- |
- return (x) { |
- int index = bisect(domain, x, 1, k) - 1; |
- return i[index](u[index](x)); |
- }; |
- } |
- |
- /// Returns the insertion point i for value x such that all values in a[lo:i] |
- /// will be less than x and all values in a[i:hi] will be equal to or greater |
- /// than x. |
- static int bisectLeft(List a, num x, [int lo = 0, int hi = -1]) { |
- if (hi == -1) { |
- hi = a.length; |
- } |
- while (lo < hi) { |
- int mid = ((lo + hi) / 2).floor(); |
- if (a[mid] < x) { |
- lo = mid + 1; |
- } else { |
- hi = mid; |
- } |
- } |
- return lo; |
- } |
- |
- /// Returns the insertion point i for value x such that all values in a[lo:i] |
- /// will be less than or equalto x and all values in a[i:hi] will be greater |
- /// than x. |
- static int bisectRight(List a, num x, [int lo = 0, int hi = -1]) { |
- if (hi == -1) { |
- hi = a.length; |
- } |
- while (lo < hi) { |
- int mid = ((lo + hi) / 2).floor(); |
- if (x < a[mid]) { |
- hi = mid; |
- } else { |
- lo = mid + 1; |
- } |
- } |
- return lo; |
- } |
- |
- static Function bisect = bisectRight; |
-} |