保证将任何范围映射到任何范围
我编写了这个方法,它完全遵循将一个数字范围映射到另一个数字范围的代数公式。计算是使用双精度来完成的,以保持精度,然后在最后,它将返回一个 Double,无论您在方法参数中指定多少小数位。
这个函数的工作原理是这样的......注意我标记了范围 A 和 B 的末端 - 那是因为没有必要让你的范围开始低和结束高或类似的东西......你可以让你的第一个范围是 300 到 -7000,第二个范围是 -3500 到 5500 ......您为范围选择的数字没有区别,它会正确映射它们。
mapOneRangeToAnother(myNumber, fromRangeA, fromRangeB, toRangeA, toRangeB, decimalPrecision)
以下是如何使用该功能的简单示例:
来源范围:-400 到 800
目的地范围:10000 到 3500
重新映射的数量:250
double sourceA = -400;
double sourceB = 800;
double destA = 10000;
double destB = 3500;
double myNum = 250;
double newNum = mapOneRangeToAnother(myNum,sourceA,sourceB,destA,destB,2);
Result: 6479.17
如果您需要一个整数,只需告诉它返回小数点后 0 位的结果并将结果转换为 int,如下所示:
int myResult = (int) mapOneRangeToAnother(myNumber, 500, 200, -350, -125, 0);
或者您可以将函数声明为返回一个 int,然后只需将最后一行从 return (double) 更改为 return (int)。
在 OPs 问题中,他们会使用如下函数:
int myResult = (int) mapOneRangeToAnother(input, input_start, input_end, output_start, output_end, 0);
这里是函数:
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 之间的所有分数......这是一种更简洁的方法,因为使用这样的函数的主代码看起来比实际上更好即时计算。
您的里程可能会有所不同...尽情享受吧! :-)