数学 - 映射数字

时间:2008-12-05 21:22:21

标签: math mapping numbers interpolation linear

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

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

我的大脑被炸了。

10 个答案:

答案 0 :(得分:177)

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

Y =(X-A)/(B-A)*(D-C)+ C

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

答案 1 :(得分:19)

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

R = (20 - 10) / (6 - 2)
y = (x - 2) * R + 10

这会均匀分布第二个范围内第一个范围的数字。

答案 2 :(得分:6)

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; } 类中使用此功能会很好,因为这是一个广泛需要的功能,并且可以在其他语言中使用。 这是一个简单的实现:

shape[0] = [71,48]

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

答案 3 :(得分:3)

顺便说一句,这与经典的将摄氏温度转换为华氏温度的问题相同,您希望将数字范围映射到0 - 100(C)到32 - 212(F)。

答案 4 :(得分:2)

https://rosettacode.org/wiki/Map_range

[a1, a2] => [b1, b2]

if s in range of [a1, a2]

then t which will be in range of [b1, b2]

t= b1 + ((s- a1) * (b2-b1))/ (a2-a1)

答案 5 :(得分:1)

第一个范围的每个单位间隔在第二个范围内占用(d-c)/(b-a)“空格”。

伪:

var interval = (d-c)/(b-a)
for n = 0 to (b - a)
    print c + n*interval

你如何处理四舍五入取决于你。

答案 6 :(得分:1)

int srcMin = 2, srcMax = 6;
int tgtMin = 10, tgtMax = 20;

int nb = srcMax - srcMin;
int range = tgtMax - tgtMin;
float rate = (float) range / (float) nb;

println(srcMin + " > " + tgtMin);
float stepF = tgtMin;
for (int i = 1; i < nb; i++)
{
  stepF += rate;
  println((srcMin + i) + " > " + (int) (stepF + 0.5) + " (" + stepF + ")");
}
println(srcMax + " > " + tgtMax);

当然,检查除以零。

答案 7 :(得分:0)

除了@PeterAllenWebb的回答,如果你想反转结果,请使用以下内容:

reverseX = (B-A)*(Y-C)/(D-C) + A

答案 8 :(得分:0)

如果您的范围是从[a到b],并且您想将其映射到[c到d],其中x是您要映射的值 使用这个公式(线性映射)

double R = (d-c)/(b-a)
double y = c+(x*R)+R
return(y)

答案 9 :(得分:0)

X 是要从 A - B 映射到 C - D < / strong>,而 Y 是结果: 取线性插值公式lerp( a b m )= a +( m *( b - a )),然后将 C D 替换为 a b 以获得 Y = C +( m *( D - C ))。然后,将( X - A )/( B - A < / strong>)获取 Y = C +(((<< strong> X - A )/( B - A ))*( D - C ))。这是可以的地图功能,但可以简化。取( D - C )件,并将其放入股息中以获得 Y = C +( (( X - A )*( D - C ))/( B - A ))。这为我们提供了另一个我们可以简化的部分,( X - A )*( D - C ),其中等于( X * D )-( X * C )-( A * D )+( A * C )。将其弹出,您会得到 Y = C +(((( X * D )-( X * C )-( A * D )+( A * C ))/( B - A ))。接下来,您需要添加+ C 位。为此,您将 C 乘以( B - A )得到(( B * C )-( A * C )),然后将其移动到股息中以获得 Y =(((( > X * D )-( X * C )-( A * D )+( A * C )+( B * C )-( A * C ))/( B - A ))。这是多余的,包含+( A * C )和-( A * C ),互相抵消。删除它们,您将得到以下最终结果: Y =((( X * D )-( X * C )-( A * D )+( B * C ) )/( B - A

TL; DR:标准地图函数 Y = C +((((( X - A )/( B - A ))*( D - C )),可以简化为< strong> Y =(( X * D )-( X * C )-( A * D )+( B * C ))/( B - A