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

Math 将任意长度转换为-1.0到1.0之间的值?,math,range,Math,Range,如何将长度转换为-1.0到1.0范围内的值 示例:我的stage长度为440px,接受鼠标事件。我想在舞台中间点击,而不是输出 x=220 < /代码>,我希望它是 x=0 < /代码>。类似地,我希望实数X=0变成X=-1.0,实数X=440变成X=1.0 我没有进入舞台的权限,所以我不能简单地将它集中注册,这将使这个过程变得容易得多。此外,不可能动态更改阶段的实际大小,因此我正在寻找一个公式,将鼠标的阶段实际X坐标转换为在-1到1的范围内均匀拟合 -1 + (2/440)*x 其中x是距离

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

示例:我的stage长度为440px,接受鼠标事件。我想在舞台中间点击,而不是输出<代码> x=220 < /代码>,我希望它是<代码> x=0 < /代码>。类似地,我希望实数
X=0
变成
X=-1.0
,实数
X=440
变成
X=1.0

我没有进入舞台的权限,所以我不能简单地将它集中注册,这将使这个过程变得容易得多。此外,不可能动态更改阶段的实际大小,因此我正在寻找一个公式,将鼠标的阶段实际X坐标转换为在-1到1的范围内均匀拟合

-1 + (2/440)*x
其中
x
是距离

因此,概括而言,如果最小规范化值是
a
,最大规范化值是
b
(在您的示例中
a=-1.0,b=1.0
,最大可能值是
k
(在您的示例中
k=440
):

其中
x
=0
(x-220)/220=新的x


这就是您要寻找的吗?

您需要移动原点并规范化范围。因此表达式变为

(XCoordinate - 220) / 220.0

这基本上是两个步骤:

  • 将范围居中于0,例如,从400到800的范围移动,使其从-200到200。通过减去范围最小值和最大值的中心(平均值)来实现
  • 除以范围极值的绝对值,以从
    -n到n
    范围转换为
    -1到1
    范围。在-200到200的示例中,您将除以200

  • 您有一个区间
    [a,b]
    要映射到一个新区间
    [c,d]
    ,在原始坐标中有一个值
    x
    ,要映射到新坐标中的
    y
    。然后:

    y = c + (x-a)*(c-d)/(b-a)
    
    [a,b]=[0440]
    [c,d]=[-1,1]
    为例,使用
    x=220

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


    <>顺便说一下,即使<代码> x <代码>在<>代码> [a,b] < /代码>之外,只要你知道这两个系统中的任意两个值,就可以在任一方向上转换任何值。

    处理任意的阶段宽度(不知道是否有线程要考虑,这可能需要互斥或相似取决于你的语言) 您可能还希望将x限制在[-1,1]范围内

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

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

    并不能回答您的问题,但对于未来的谷歌搜索者来说,如果他们想寻找一个将所有实数映射到(-1,1)的连续函数,任何函数都可以,例如或:

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

    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
    
    if ( x < -1 ) x = -1.0;
    if ( x >  1 ) x =  1.0;
    
    f(x) = atan(x) / (pi/2) f(x) = 2/(1+e-x) - 1