dev@343: /** dev@343: * Created by lucast on 23/05/2017. dev@343: */ dev@343: dev@343: export function interpolatingMapper(hexColours) { dev@343: const colours = hexColours.map(n => { dev@343: const i = parseInt(n, 16); dev@343: return [ ((i >> 16) & 255) / 255.0, dev@343: ((i >> 8) & 255) / 255.0, dev@343: ((i) & 255) / 255.0 ]; dev@343: }); dev@343: const last = colours.length - 1; dev@343: return (value => { dev@343: const m = value * last; dev@343: if (m >= last) { dev@343: return colours[last]; dev@343: } dev@343: if (m <= 0) { dev@343: return colours[0]; dev@343: } dev@343: const base = Math.floor(m); dev@343: const prop0 = base + 1.0 - m; dev@343: const prop1 = m - base; dev@343: const c0 = colours[base]; dev@343: const c1 = colours[base + 1]; dev@343: return [ c0[0] * prop0 + c1[0] * prop1, dev@343: c0[1] * prop0 + c1[1] * prop1, dev@343: c0[2] * prop0 + c1[2] * prop1 ]; dev@343: }); dev@343: } dev@343: dev@343: export function iceMapper() { dev@343: const hexColours = [ dev@343: // Based on ColorBrewer ylGnBu dev@343: 'ffffff', 'ffff00', 'f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5', dev@343: '7bccc4', '4eb3d3', '2b8cbe', '0868ac', '084081', '042040' dev@343: ]; dev@343: hexColours.reverse(); dev@343: return interpolatingMapper(hexColours); dev@343: } dev@343: dev@343: export function greenMapper() { dev@343: const blue = 0.6666; dev@343: const pieslice = 0.3333; dev@343: return (value => { dev@343: const h = blue - value * 2.0 * pieslice; dev@343: const s = 0.5 + value / 2.0; dev@343: const v = value; dev@343: return this.hsv2rgb(h, s, v); dev@343: }); dev@343: } dev@343: dev@343: export function sunsetMapper() { dev@343: return (value => { dev@343: const r = (value - 0.24) * 2.38; dev@343: const g = (value - 0.64) * 2.777; dev@343: let b = (3.6 * value); dev@343: if (value > 0.277) { dev@343: b = 2.0 - b; dev@343: } dev@343: return [ r, g, b ]; dev@343: }); dev@343: } dev@343: dev@343: export function hsv2rgb(h, s, v) { // all values in range [0, 1] dev@343: const i = Math.floor(h * 6); dev@343: const f = h * 6 - i; dev@343: const p = v * (1 - s); dev@343: const q = v * (1 - f * s); dev@343: const t = v * (1 - (1 - f) * s); dev@343: let r = 0, g = 0, b = 0; dev@343: switch (i % 6) { dev@343: case 0: r = v; g = t; b = p; break; dev@343: case 1: r = q; g = v; b = p; break; dev@343: case 2: r = p; g = v; b = t; break; dev@343: case 3: r = p; g = q; b = v; break; dev@343: case 4: r = t; g = p; b = v; break; dev@343: case 5: r = v; g = p; b = q; break; dev@343: } dev@343: return [ r, g, b ]; dev@343: }