如何在a和b之间线性地映射数字以在c和d之间进行.
也就是说,我希望2到6之间的数字映射到10到20之间的数字......但我需要一般化的情况.
我的大脑是油炸的.
如果您的数字X在A和B之间,并且您希望Y在C和D之间,则可以应用以下线性变换:
Y =(XA)/(BA)*(DC)+ C.
这应该会给你你想要的东西,虽然你的问题有点模棱两可,因为你也可以反过来映射间隔.只要注意除以零,你应该没问题.
除以获得两个范围的大小之间的比率,然后减去初始范围的起始值,乘以比率并添加第二个范围的起始值.换一种说法,
R = (20 - 10) / (6 - 2) y = (x - 2) * R + 10
这均匀地分散了第二个范围中第一个范围的数字.
在java.lang.Math
类中使用此功能会很不错,因为这是一个广泛需要的功能,并且可以在其他语言中使用.这是一个简单的实现:
final static double EPSILON = 1e-12; public static double map(double valueCoord1, double startCoord1, double endCoord1, double startCoord2, double endCoord2) { if (Math.abs(endCoord1 - startCoord1) < EPSILON) { throw new ArithmeticException("/ 0"); } double offset = startCoord2; double ratio = (endCoord2 - startCoord2) / (endCoord1 - startCoord1); return ratio * (valueCoord1 - startCoord1) + offset; }
我将此代码作为未来自己的参考,可能会帮助某人.