代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

如何将<0;99>范围内的数字映射到<1.0;1.0>范围内?

  •  8
  • Richard Knop  · 技术社区  · 14 年前

    所以我有一个函数,它总是返回一个范围<0;99>(即0,1,…)内的数字。。。99-整数)。

    正确地将这些数字映射到范围<-1.0;1.0>的最佳方法是什么;?

    0当然是-1.0,99当然是1.0。如何计算两者之间的数字?

    6 回复  |  直到 14 年前
        1
  •  22
  •   Mark Byers    14 年前

    使用线性映射:

    y = ((x / 99.0) * 2) - 1
    

    工作原理:

    • 除以99:这会规范化从[0,99]到[0,1]的范围。
    • 乘以2:这会将范围增加到[0,2]。
    • 减1:这是一个翻译,给出了[-1,1]。

    当然,如果您愿意,您可以将步骤((x/99.0)*2)合并为一个分区。为了清楚起见,我把它分开了。

        2
  •  18
  •   Glenn Maynard    14 年前

    不要手动缩放;要想弄清楚真正的目的,需要太多的斜视数学。使用助手函数。

    def scale(val, src, dst):
        """
        Scale the given value from the scale of src to the scale of dst.
        """
        return ((val - src[0]) / (src[1]-src[0])) * (dst[1]-dst[0]) + dst[0]
    
    print scale(0, (0.0, 99.0), (-1.0, +1.0))
    print scale(1, (0.0, 99.0), (-1.0, +1.0))
    print scale(99, (0.0, 99.0), (-1.0, +1.0))
    

    我发现这是任何语言中更有用的函数之一;您可以一眼看出scale()调用的作用。

        3
  •  8
  •   Lasse V. Karlsen    14 年前

    映射值 x 在此范围内:

    [a..b]
    

    到这个范围:

    [a'..b']
    

    使用以下公式:

    x' = (x / 99) * 2 - 1
    

    这种映射的工作方式如下:

    x' = ((x - a) / (b - a)) * (b' - a') + a'
    

    一步一步地:

    1. 你首先计算出 a..b 这个 值为:

      (x - a) / (b - a)
      

      此值将介于0和1之间。

    2. 然后使用该值计算 a'..b' 值应为:

      ratio * (b' - a') + a'
      

    在你的特殊情况下:

    x' = ((x - 0) / (99 - 0)) * (1.0 - (-1.0)) + (-1.0)
    

    或以合同形式:

    x’=(x/99)*2-1
    

    注意 :如果在编程语言中执行此操作,其中整数除以另一个整数就是整数除法,则应将值提升为浮点,以避免处理精度损失:

    x' = (x / 99.0) * 2.0 - 1.0
    
        4
  •  3
  •   Pwdr    12 年前

    对任何范围都使用这个(也可以是负数)。

    [minFrom..maxFrom]->[minTo..maxTo]

    mappedValue = minTo + (maxTo - minTo) * ((value - minFrom) / (maxFrom - minFrom));
    
        5
  •  2
  •   Darshan Chaudhary    9 年前

    使用 numpy ,那将是最有效的

    >>> from numpy import interp
    >>> interp(50, [0,99], [-1,1])
    0.010101010101010166
    
        6
  •  -1
  •   Neil    14 年前
    n = (n / 99) * 2 - 1;