我有一个来自float
的{{1}},我希望将其转换为0 to 100
中的一个数字:
-20 to 20
为float
,然后翻译为100
-20
为float
,然后翻译为50
0
为float
,然后翻译为0
这样做的最佳方法是什么?
答案 0 :(得分:10)
[我将为您提供解决问题的方法,而不仅仅是答案,因为从长远来看它会更有用。]
您需要一个y = mx + c
形式的线性变换,其中x
是您的输入数字,y
是您的输出数字,m
和{{1}你需要提前确定的常数。
为此,您需要解决以下联立方程式:
c
请注意,我已经选择了两个您需要的转换示例,并将它们插入等式中。我本可以挑选任何两个。
答案 1 :(得分:3)
这个怎么样:(50. - x) * 0.4
答案 2 :(得分:2)
这样的事情应该做:
20 - val * 0.4
答案 3 :(得分:1)
float procent = (myval - 50)/2.5f;
如果您需要整数,请使用(int) floor(procent)
答案 4 :(得分:1)
float translate(float f)
{
return 20.0f - ((20.0f * f) / 50.0f);
}
答案 5 :(得分:1)
您想要实现的目标称为“线性插值”,可以在如下的常规函数中完成:
float linear_interpolate(float x, float x0, float x1, float y0, float y1)
{
return y0 + (x - x0)*((y1-y0)/(x1-x0));
}
在你的情况下你会称之为(用你的in值替换x):
float value = linear_interpolate(x, 0.0f, 100.0f, -20.0f, 20.0f);
有关参考文章,请参阅http://en.wikipedia.org/wiki/Linear_interpolation。
答案 6 :(得分:0)
((x / 2.5)- 20) * -1
这应该做到
答案 7 :(得分:0)
您需要计算斜率。由于你已经有3个点(0,-20)(50,0)(100,20),你可以做dx = 40/100 = 2/5(y的变化/ x的变化)和b = -20。然后定义一个函数(f(x)= mx + b)f(x)=(2/5)* x - 20,0 <= x <= 100。