source: node_modules/d3-scale/src/continuous.js@ e4c61dd

Last change on this file since e4c61dd was e4c61dd, checked in by istevanoska <ilinastevanoska@…>, 6 months ago

Prototype 1.1

  • Property mode set to 100644
File size: 3.4 KB
Line 
1import {bisect} from "d3-array";
2import {interpolate as interpolateValue, interpolateNumber, interpolateRound} from "d3-interpolate";
3import constant from "./constant.js";
4import number from "./number.js";
5
6var unit = [0, 1];
7
8export function identity(x) {
9 return x;
10}
11
12function normalize(a, b) {
13 return (b -= (a = +a))
14 ? function(x) { return (x - a) / b; }
15 : constant(isNaN(b) ? NaN : 0.5);
16}
17
18function clamper(a, b) {
19 var t;
20 if (a > b) t = a, a = b, b = t;
21 return function(x) { return Math.max(a, Math.min(b, x)); };
22}
23
24// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
25// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
26function bimap(domain, range, interpolate) {
27 var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
28 if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
29 else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
30 return function(x) { return r0(d0(x)); };
31}
32
33function polymap(domain, range, interpolate) {
34 var j = Math.min(domain.length, range.length) - 1,
35 d = new Array(j),
36 r = new Array(j),
37 i = -1;
38
39 // Reverse descending domains.
40 if (domain[j] < domain[0]) {
41 domain = domain.slice().reverse();
42 range = range.slice().reverse();
43 }
44
45 while (++i < j) {
46 d[i] = normalize(domain[i], domain[i + 1]);
47 r[i] = interpolate(range[i], range[i + 1]);
48 }
49
50 return function(x) {
51 var i = bisect(domain, x, 1, j) - 1;
52 return r[i](d[i](x));
53 };
54}
55
56export function copy(source, target) {
57 return target
58 .domain(source.domain())
59 .range(source.range())
60 .interpolate(source.interpolate())
61 .clamp(source.clamp())
62 .unknown(source.unknown());
63}
64
65export function transformer() {
66 var domain = unit,
67 range = unit,
68 interpolate = interpolateValue,
69 transform,
70 untransform,
71 unknown,
72 clamp = identity,
73 piecewise,
74 output,
75 input;
76
77 function rescale() {
78 var n = Math.min(domain.length, range.length);
79 if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);
80 piecewise = n > 2 ? polymap : bimap;
81 output = input = null;
82 return scale;
83 }
84
85 function scale(x) {
86 return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
87 }
88
89 scale.invert = function(y) {
90 return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
91 };
92
93 scale.domain = function(_) {
94 return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();
95 };
96
97 scale.range = function(_) {
98 return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
99 };
100
101 scale.rangeRound = function(_) {
102 return range = Array.from(_), interpolate = interpolateRound, rescale();
103 };
104
105 scale.clamp = function(_) {
106 return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;
107 };
108
109 scale.interpolate = function(_) {
110 return arguments.length ? (interpolate = _, rescale()) : interpolate;
111 };
112
113 scale.unknown = function(_) {
114 return arguments.length ? (unknown = _, scale) : unknown;
115 };
116
117 return function(t, u) {
118 transform = t, untransform = u;
119 return rescale();
120 };
121}
122
123export default function continuous() {
124 return transformer()(identity, identity);
125}
Note: See TracBrowser for help on using the repository browser.