数学 - 映射数字

Sam*_*Sam 91 mapping math interpolation numbers linear-algebra

如何在a和b之间线性地映射数字以在c和d之间进行.

也就是说,我希望2到6之间的数字映射到10到20之间的数字......但我需要一般化的情况.

我的大脑是油炸的.

Pet*_*ebb 194

如果您的数字X在A和B之间,并且您希望Y在C和D之间,则可以应用以下线性变换:

Y =(XA)/(BA)*(DC)+ C.

这应该会给你你想要的东西,虽然你的问题有点模棱两可,因为你也可以反过来映射间隔.只要注意除以零,你应该没问题.

  • 然后可以通过单击旁边的刻度标记将此答案标记为"已接受". (46认同)
  • 为清楚起见,我喜欢new_value =(old_value - old_bottom)/(old_top - old_bottom)*(new_top - new_bottom)+ new_bottom; (12认同)
  • 这个方程在某处有推导吗? (2认同)
  • 要反转方向,公式为 ( (XA)/(AB) * (CD) ) * -1 + D (2认同)

Kon*_*lph 20

除以获得两个范围的大小之间的比率,然后减去初始范围的起始值,乘以比率并添加第二个范围的起始值.换一种说法,

R = (20 - 10) / (6 - 2)
y = (x - 2) * R + 10
Run Code Online (Sandbox Code Playgroud)

这均匀地分散了第二个范围中第一个范围的数字.


Sou*_*hat 7

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;
}
Run Code Online (Sandbox Code Playgroud)

我将此代码作为未来自己的参考,可能会帮助某人.