这保证将ANY范围映射到ANY范围
我写了这种方法,它精确地遵循了将一个数字范围映射到另一个数字范围的代数公式。计算是通过使用double进行的,以保持精度,然后最后,它将返回一个Double,该double具有您在方法参数中指定的许多小数位。
该函数的工作方式如下...注意,我标记了范围A和B的末端-这是因为没有必要使范围从低端开始并从高端结束或类似的事情...您可以将第一个范围设为300到-7000,第二个范围-3500到5500 ...为范围选择的数字没有区别,它将正确地映射它们。
mapOneRangeToAnother(myNumber, fromRangeA, fromRangeB, toRangeA, toRangeB, decimalPrecision)
如果您需要返回一个整数,只需告诉它以小数点后一位返回结果,然后将结果转换为int,如下所示:
int myResult = (int) mapOneRangeToAnother(myNumber, 500, 200, -350, -125, 1);
在OP的原始问题中,他们将使用如下功能:
int myResult = (int) mapOneRangeToAnother(input, input_start, input_end, output_start, output_end, 1);
这是函数:
public static double mapOneRangeToAnother(double sourceNumber, double fromA, double fromB, double toA, double toB, int decimalPrecision ) {
double deltaA = fromB - fromA;
double deltaB = toB - toA;
double scale = deltaB / deltaA;
double negA = -1 * fromA;
double offset = (negA * scale) + toA;
double finalNumber = (sourceNumber * scale) + offset;
int calcScale = (int) Math.pow(10, decimalPrecision);
return (double) Math.round(finalNumber * calcScale) / calcScale;
}
我什至在计数器中使用了此功能以淡化屏幕上的某些内容,但是由于不透明度是介于0和1之间的值,因此我将计数器设置为从0到100进行计数,然后将范围从0到100映射到0 -1,并且通过将数字从0到100馈给它来获取0到1之间的所有分数...这是一种更干净的方法,因为使用类似这样的函数,主代码看起来比实际执行数学运算更好在飞行中。
您的里程可能会有所不同。:-)