用Javascript中的插值将数字映射到其他数字



我有一个数据集,其中包含不规则盆地给定表面高程的体积例如:

cm      kL
11870 : 6043453
11871 : 6053522
11872 : 6063591
11873 : 6073674
11874 : 6083767
(...1550 rows)

cm总是递增一的级数;相关的kL值是不规则的,但总是增加且从不重复。映射永远不会改变,并且可以以任何方便的格式加载/存储。

Javascript有一种在cm和kL之间转换的简单方法吗理想情况下在两个方向上进行线性插值。最终,我正在寻找这个功能:

cm_to_kL(11872.2); //Expect 6065607.6
kL_to_cm(6065600); //Expect 11872.199

我写了一个如何开始解决这个问题的例子。如前所述,没有用于插值或处理此类结构的内部功能,但您需要编写自己的逻辑。

我不得不承认,我不是数学专家(现在是凌晨2点,但这个问题让我感兴趣:D(。

我希望这能帮助你至少开始:

const data = {
11870 : 6043453,
11871 : 6053522,
11872 : 6063591,
11873 : 6073674,
11874 : 6083767,
};
const cm_to_kL = (val) => {
const cm_ref = Math.floor(val);
const factor = parseFloat((val % cm_ref).toFixed(5));
const lower = data[cm_ref];
const higher = data[cm_ref + 1];
if (isNaN(lower) || isNaN(higher)) {
throw Error('Data entry point not found');
}

const result = lower + ((higher - lower) * factor);
if (isNaN(result)) {
throw Error('Incorrect data provided');
}
return result;
};
const kL_to_cm = (val) => {
const [cm, kL] = Object.entries(data).find(([k, v]) => val < v);
if (isNaN(cm) || isNaN(kL)) {
throw Error('Data entry point not found');
}

const lower_cm = cm - 1;
const lower_kL = data[lower_cm];
const diff = (val - lower_kL) / (kL - lower_kL);
const result = parseFloat((lower_cm + diff).toFixed(5))
if (isNaN(result)) {
throw Error('Incorrect data provided');
}
return result; 
};
console.log('11872.2',
cm_to_kL(11872.2),
);
console.log('6065600',
kL_to_cm(6065600),
);

是的,JS当然要做你需要做的!您可以从给定的数组中创建2个映射,一个用于cm到kL,另一个用于kL到cm。为它们创建两个函数cm_to_kLkL_to_cm以从Map获取值。之后,您可以轻松地获得具有O(1(复杂性的元素

最新更新