折叠数字数组的曲线

时间:2018-06-02 02:56:05

标签: javascript math

我试图找到规范化的技巧(不确定这是否是正确的词)一系列数字。

说我有一个数组:

[0,1,2,3,4,70,80,900]

我想展平或平均范围曲线,所以它更像是:

[10,11,12,13,14,50,100,300]。 //不是真正的计算

因此,与减少较大的数字相比,增加较小的数字。

这种技术叫做什么?标准化规模?我希望在一些Javascript中实现这一点。

更新:希望能够更好地描述我尝试做的事情:

我有一组原始数字:

[0, 10, 15, 50, 70, 100]

通过function averageOutAllNumbers(array, slider)进行处理时,会生成slider设置为100%时的数组:

[0, 20, 40, 60, 80, 100] // the curve has been flattened

当滑块设置为0%时,它将返回原始数组。如果slider设置为50%,则返回的数组将显示为某些内容

[0, 12, 19, 52, 88, 100] // the curve is less steep [do not take these number literally, I'm guess what the output would be based on the slider].

array.max()总是100

1 个答案:

答案 0 :(得分:0)

感谢迄今为止的评论,他们确实让我更接近解决方案。 不,谢谢那些投票的巨魔;如果你无法修复它,没有人可以做到!

当我更新我的问题时,我意识到"增加与减少较大数字相关的较小数字" 最终将导致均匀分布的数字集,例如[20, 20, 20, 20, 20]。但是我确实想要像我在问题中所说的那样:[0, 20, 40, 60, 80, 100] // the curve has been flattened。我做了一些搜索,比如:

  • 均匀地间隔一组奇数间隔的数字
  • 在一定范围内制作均匀间隔的数字列表
  • 在指定的时间间隔内返回均匀间隔的数字
  • 查找两个数字之间的X百分比

在搜索结果列表中,我看到了原始问题的答案:"这种技术叫做什么?" Linear Interpolation

基于此,我能够创建以下内容:

var orig = [3, 11, 54, 72, 100];

function lerp(n, x0, x1) {
    // returns a position: x that is n percent between y0 and y1
    // As numbers in array are x only, y values are fixed to 0(start) - 1(end)
    const y0 = 0;
    const y1 = 1;
    const x = ((y1 - n)*x0 + (n - y0)*x1) / (y1 - y0);

    return x;
}

var flattenedEven = orig.map((value, index, arr) => {
    return lerp(1, value, (Math.max(...arr)/arr.length) * (index + 1));
});

//=> [20, 40, 60, 80, 100]

var flattenedCurve = orig.map((value, index, arr) => {
    return lerp(.7, value, (Math.max(...arr)/arr.length) * (index + 1));
});

//=> [14.9, 31.3, 58.2, 77.6, 100]