如何在a和b之间线性地映射数字以在c和d之间进行。
也就是说,我希望2到6之间的数字映射到10到20之间的数字......但我需要一般情况。
我的大脑被炸了。
答案 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 )