partylights/boilerbloat/src/patterns/util.ts
2021-11-13 12:22:41 +01:00

23 lines
768 B
TypeScript

// https://stackoverflow.com/a/54014428
// input: h in [0,360] and s,v in [0,1] - output: r,g,b in [0,1]
export function hsl2rgb(h: number, s: number, l: number) {
let a = s * Math.min(l, 1 - l);
let f = (n: number, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
return [f(0), f(8), f(4)];
}
export function clamp(x: number, bounds: [number, number]): number {
const lower = Math.min(...bounds);
const upper = Math.max(...bounds);
return Math.max(lower, Math.min(upper, x));
}
export function rescale(x: number, range: { from?: [number, number], to?: [number, number] }): number {
const [a, b] = range.from ? range.from : [0, 1];
const [c, d] = range.to ? range.to : [0, 1];
return c + (d - c) * (x - a) / (b - a);
}