dev@343
|
1 /**
|
dev@343
|
2 * Created by lucast on 23/05/2017.
|
dev@343
|
3 */
|
dev@343
|
4
|
dev@343
|
5 export function interpolatingMapper(hexColours) {
|
dev@343
|
6 const colours = hexColours.map(n => {
|
dev@343
|
7 const i = parseInt(n, 16);
|
dev@343
|
8 return [ ((i >> 16) & 255) / 255.0,
|
dev@343
|
9 ((i >> 8) & 255) / 255.0,
|
dev@343
|
10 ((i) & 255) / 255.0 ];
|
dev@343
|
11 });
|
dev@343
|
12 const last = colours.length - 1;
|
dev@343
|
13 return (value => {
|
dev@343
|
14 const m = value * last;
|
dev@343
|
15 if (m >= last) {
|
dev@343
|
16 return colours[last];
|
dev@343
|
17 }
|
dev@343
|
18 if (m <= 0) {
|
dev@343
|
19 return colours[0];
|
dev@343
|
20 }
|
dev@343
|
21 const base = Math.floor(m);
|
dev@343
|
22 const prop0 = base + 1.0 - m;
|
dev@343
|
23 const prop1 = m - base;
|
dev@343
|
24 const c0 = colours[base];
|
dev@343
|
25 const c1 = colours[base + 1];
|
dev@343
|
26 return [ c0[0] * prop0 + c1[0] * prop1,
|
dev@343
|
27 c0[1] * prop0 + c1[1] * prop1,
|
dev@343
|
28 c0[2] * prop0 + c1[2] * prop1 ];
|
dev@343
|
29 });
|
dev@343
|
30 }
|
dev@343
|
31
|
dev@343
|
32 export function iceMapper() {
|
dev@343
|
33 const hexColours = [
|
dev@343
|
34 // Based on ColorBrewer ylGnBu
|
dev@343
|
35 'ffffff', 'ffff00', 'f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5',
|
dev@343
|
36 '7bccc4', '4eb3d3', '2b8cbe', '0868ac', '084081', '042040'
|
dev@343
|
37 ];
|
dev@343
|
38 hexColours.reverse();
|
dev@343
|
39 return interpolatingMapper(hexColours);
|
dev@343
|
40 }
|
dev@343
|
41
|
dev@343
|
42 export function greenMapper() {
|
dev@343
|
43 const blue = 0.6666;
|
dev@343
|
44 const pieslice = 0.3333;
|
dev@343
|
45 return (value => {
|
dev@343
|
46 const h = blue - value * 2.0 * pieslice;
|
dev@343
|
47 const s = 0.5 + value / 2.0;
|
dev@343
|
48 const v = value;
|
dev@343
|
49 return this.hsv2rgb(h, s, v);
|
dev@343
|
50 });
|
dev@343
|
51 }
|
dev@343
|
52
|
dev@343
|
53 export function sunsetMapper() {
|
dev@343
|
54 return (value => {
|
dev@343
|
55 const r = (value - 0.24) * 2.38;
|
dev@343
|
56 const g = (value - 0.64) * 2.777;
|
dev@343
|
57 let b = (3.6 * value);
|
dev@343
|
58 if (value > 0.277) {
|
dev@343
|
59 b = 2.0 - b;
|
dev@343
|
60 }
|
dev@343
|
61 return [ r, g, b ];
|
dev@343
|
62 });
|
dev@343
|
63 }
|
dev@343
|
64
|
dev@343
|
65 export function hsv2rgb(h, s, v) { // all values in range [0, 1]
|
dev@343
|
66 const i = Math.floor(h * 6);
|
dev@343
|
67 const f = h * 6 - i;
|
dev@343
|
68 const p = v * (1 - s);
|
dev@343
|
69 const q = v * (1 - f * s);
|
dev@343
|
70 const t = v * (1 - (1 - f) * s);
|
dev@343
|
71 let r = 0, g = 0, b = 0;
|
dev@343
|
72 switch (i % 6) {
|
dev@343
|
73 case 0: r = v; g = t; b = p; break;
|
dev@343
|
74 case 1: r = q; g = v; b = p; break;
|
dev@343
|
75 case 2: r = p; g = v; b = t; break;
|
dev@343
|
76 case 3: r = p; g = q; b = v; break;
|
dev@343
|
77 case 4: r = t; g = p; b = v; break;
|
dev@343
|
78 case 5: r = v; g = p; b = q; break;
|
dev@343
|
79 }
|
dev@343
|
80 return [ r, g, b ];
|
dev@343
|
81 }
|