import type { NumberRange, ValueRange } from './basic';
|
export type Rgb = [number, number, number];
|
|
export type ColorRange = ValueRange<Rgb>;
|
export class ColorMapper {
|
private readonly _colorRange = null;
|
private readonly _valueRange = null;
|
|
constructor(valueRange: NumberRange, colorRange: ColorRange) {
|
this._colorRange = colorRange;
|
this._valueRange = valueRange;
|
}
|
|
private mapValueToColor(value): Rgb {
|
const { min: valueMin, max: valueMax } = this.valueRange;
|
const { min: colorMin, max: colorMax } = this.colorRange;
|
|
// 确保值在范围内
|
const clampedValue = Math.min(Math.max(value, valueMin), valueMax);
|
|
// 计算归一化值(0到1之间的值)
|
const normalizedValue = (clampedValue - valueMin) / (valueMax - valueMin);
|
|
// 使用线性插值计算颜色分量
|
const red = Math.floor(colorMin[0] + (colorMax[0] - colorMin[0]) * normalizedValue);
|
const green = Math.floor(colorMin[1] + (colorMax[1] - colorMin[1]) * normalizedValue);
|
const blue = Math.floor(colorMin[2] + (colorMax[2] - colorMin[2]) * normalizedValue);
|
|
// 返回 RGB 颜色字符串
|
// return `rgb(${red}, ${green}, ${blue})`;
|
return [red, green, blue];
|
}
|
|
/**
|
* 通过值获取颜色
|
* @param value
|
*/
|
getByValue(value: number) {
|
const rgb = this.mapValueToColor(value);
|
return rgb;
|
|
}
|
|
public get colorRange(): ColorRange {
|
return this._colorRange;
|
}
|
|
public get valueRange(): NumberRange {
|
return this._valueRange;
|
}
|
}
|