Math 将任意长度转换为-1.0到1.0之间的值?
如何将长度转换为-1.0到1.0范围内的值 示例:我的stage长度为440px,接受鼠标事件。我想在舞台中间点击,而不是输出<代码> x=220 < /代码>,我希望它是<代码> x=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是距离
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