23 lines
768 B
TypeScript
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);
|
|
}
|