从“斩波”输入范围

时间:2017-04-01 18:47:35

标签: algorithm interpolation

我正在寻找一个函数或算法,对于指定范围内的值,它将返回一个相同范围内的值但是基于值的切入/除法。很难解释 - 一些预期的输出在这个空壳上

function choppedRange(value, min, max, chops) {
    // value - a value in range min to max
    // chops - integer defining how many "subranges" or "chops" to return values from
    ...
}

// Map (linear conversion) input value in range oldMin -> oldMax
// to a value in range newMin -> newMax
function remap(oldValue, oldMin, oldMax, newMin, newMax) {
    return (((oldValue - oldMin) * (newMax - newMin)) / (oldMax - oldMin)) + newMin;
}

Illustration 图示试图显示如下:

  1. 确定输入值(蓝点)的切割位置。 (假设它的值是0.35 ...)
  2. 重新映射(上面的函数)范围0.350,25的值(蓝色)0.5minmax参数的范围内,例如01remap(0.35, 0.25, 0.5, 0, 1)
  3. 带有示例值的输出(绿点)应为0.3999...
  4. 希望你能看出我的意思。

    正如您所看到的,我已完成重新映射 - 但我无法确定remap输入的“chop”值 - 就像这样:

    remap(input_value, chop_min, chop_max, min, max)
    

    我希望根据chop_min

    中的chop_max参数找到chopschoppedRange
    function choppedRange(value, min, max, chops) {
        // Figure out chop_min and chop_max
        ...
        return remap(value, chop_min, chop_max, min, max)
    }
    

1 个答案:

答案 0 :(得分:1)

我最终得到了这个实现



function choppedRange(value, min, max, chops) {
  // value - a value in range min to max
  // chops - integer defining how many "subranges" or "chops" to return values from
  var chopMin = min, chopMax = max, chopValue = max / chops, i, c
  for (i = 1; i <= chops; i++) {
    c = chopValue * i
    if (c < value)
      chopMin = c
    if (c >= value) {
      chopMax = c
      break;
    }
  }
  return (((value - chopMin) * (max - min)) / (chopMax - chopMin)) + min
}

var r = choppedRange(0, 0, 1, 4)
console.log('Result',r)
r = choppedRange(0.35, 0, 1, 4)
console.log('Result',r)
r = choppedRange(0.5, 0, 1, 4)
console.log('Result',r)
r = choppedRange(0.6, 0, 1, 4)
console.log('Result',r)
r = choppedRange(1, 0, 1, 4)
console.log('Result',r)
&#13;
&#13;
&#13;