代码之家  ›  专栏  ›  技术社区  ›  Chunky Chunk

将任意长度转换为-1.0到1.0之间的值?

  •  6
  • Chunky Chunk  · 技术社区  · 14 年前

    如何将长度转换为-1.0到1.0范围内的值?

    示例:我的stage长度为440px,接受鼠标事件。我想点击中间的阶段,而不是一个输出 X = 220 ,我希望是这样 X = 0 X=0 成为 X = -1.0 还有真实的 X = 440 X = 1.0 .

    7 回复  |  直到 14 年前
        1
  •  11
  •   Jacob    14 年前
    -1 + (2/440)*x
    

    哪里 x 距离是多少

    如果最小归一化值为 a b (在你的例子中 a = -1.0, b = 1.0 最大可能值为 k k = 440 ):

    a + x*(b-a)/k
    

    哪里 >= 0 <= k

        2
  •  4
  •   Michael Mrozek    14 年前

    1. 将范围居中于0,例如从400到800的范围移动到-200到200。通过减去范围的最小值和最大值的中心(平均值)来实现
    2. -n to n -1 to 1 射程。在-200到200的例子中,你要除以200
        3
  •  3
  •   Community rohancragg    7 年前

    不回答你的问题,但对于未来的谷歌搜索者来说 monotone sigmoid curve 会的,比如 atan 或者 logistic curve

    f(x) = atan(x) / (pi/2)  
    f(x) = 2/(1+e-x) - 1
    

    (image alt text)

        4
  •  1
  •   Bob Montgomery    14 年前

    (x-220)/220=新x

        5
  •  1
  •   dotcoder    14 年前

    您需要移动原点并规范化范围。所以这个表达式变成

    (XCoordinate - 220) / 220.0
    
        6
  •  1
  •   drfrogsplat    14 年前

    stageWidth = GetStageWidth(); // which may return 440 in your case
    clickedX = MouseInput(); // should be 0 to 440
    x = -1.0 + 2.0 * (clickedX / stageWidth); // scale to -1.0 to +1.0
    

    您可能还想将x限制在[-1,1]范围内?

    if ( x < -1 ) x = -1.0;
    if ( x >  1 ) x =  1.0;
    

    或者在超出范围时提供某种反馈/警告/错误(仅当 重要的是,简单地将其剪切到范围[-1,1]是不够的)。

        7
  •  1
  •   Jim Lewis    14 年前

    你有休息时间 [a,b] 你想映射到一个新的区间 [c,d] ,和一个值 x y 在新的坐标系中。然后:

    y = c + (x-a)*(c-d)/(b-a)
    

    作为你的例子 [a,b] = [0,440] [c,d] = [-1,1] ,与 x=220

    y = -1 + (220-0)*(1 - -1)/(440-0)
      = 0
    

    等等。

    顺便说一下,即使 在…之外 . 所以只要你知道 任何 在两个系统中都有两个值,可以在任意方向上转换任何值。