如何避免 "trap" 线性插值?
How to avoid "trap" with linear interpolation?
我有一个范围 a
(起始范围)和一个范围 b
(目标范围),我需要从范围 a
缩放一个值 aX
范围 b
。代码是基本的线性插值:
double LinearInterpolation(double a0, double a1, double b0, double b1, double aX) {
return b0 + (b1 - b0) * (aX - a0) / (a1 - a0);
}
事实是:范围 b 可以是从 1.0 到 1.0 的 0 长度。但是当我达到那个范围时,我得到了一个 "trap" 的值,并且无法返回。 Here's一个例子:
int main ()
{
double a0 = 0.4;
double a1 = 1.0;
double b0 = 0.6;
double b1 = 1.0;
double aX = 0.58;
aX = LinearInterpolation(a0, a1, b0, b1, aX);
std::cout << aX << std::endl;
b0 = 1.0;
aX = LinearInterpolation(a0, a1, b0, b1, aX);
std::cout << aX << std::endl;
b0 = 0.6;
aX = LinearInterpolation(a0, a1, b0, b1, aX);
std::cout << aX << std::endl;
}
在 b0
为 0 之前,它会正确缩放 aX
值。当我到达b0 = b1 = 1.0
时,我无法返回(aX
总是1.0,因为aX = a1
,因此总是b0 + (b1 - b0) => b1
)。
我怎样才能避免这种情况?
How can I avoid this?
不存储实际值,而是存储范围内的相对位置:
struct value_in_range {
double normalized_offset;
double in_range (double from, double to) const {
return from + (to - from) * normalized_offset;
}
};
value_in_range make_value_in_range (double from, double value, double to) {
// Add assertions to avoid misuse
return {(value - from) / (to - from)};
}
以你为例:
int main ()
{
double a0 = 0.4;
double a1 = 1.0;
double b0 = 0.6;
double b1 = 1.0;
double aX = 0.58;
value_in_range X = make_value_in_range (a0, aX, a1);
std::cout << X.in_range(b0, b1) << std::endl;
b0 = 1.0;
std::cout << X.in_range(b0, b1) << std::endl;
b0 = 0.6;
std::cout << X.in_range(b0, b1) << std::endl;
}
您也可以按照您的原始代码设置 aX
。
我有一个范围 a
(起始范围)和一个范围 b
(目标范围),我需要从范围 a
缩放一个值 aX
范围 b
。代码是基本的线性插值:
double LinearInterpolation(double a0, double a1, double b0, double b1, double aX) {
return b0 + (b1 - b0) * (aX - a0) / (a1 - a0);
}
事实是:范围 b 可以是从 1.0 到 1.0 的 0 长度。但是当我达到那个范围时,我得到了一个 "trap" 的值,并且无法返回。 Here's一个例子:
int main ()
{
double a0 = 0.4;
double a1 = 1.0;
double b0 = 0.6;
double b1 = 1.0;
double aX = 0.58;
aX = LinearInterpolation(a0, a1, b0, b1, aX);
std::cout << aX << std::endl;
b0 = 1.0;
aX = LinearInterpolation(a0, a1, b0, b1, aX);
std::cout << aX << std::endl;
b0 = 0.6;
aX = LinearInterpolation(a0, a1, b0, b1, aX);
std::cout << aX << std::endl;
}
在 b0
为 0 之前,它会正确缩放 aX
值。当我到达b0 = b1 = 1.0
时,我无法返回(aX
总是1.0,因为aX = a1
,因此总是b0 + (b1 - b0) => b1
)。
我怎样才能避免这种情况?
How can I avoid this?
不存储实际值,而是存储范围内的相对位置:
struct value_in_range {
double normalized_offset;
double in_range (double from, double to) const {
return from + (to - from) * normalized_offset;
}
};
value_in_range make_value_in_range (double from, double value, double to) {
// Add assertions to avoid misuse
return {(value - from) / (to - from)};
}
以你为例:
int main ()
{
double a0 = 0.4;
double a1 = 1.0;
double b0 = 0.6;
double b1 = 1.0;
double aX = 0.58;
value_in_range X = make_value_in_range (a0, aX, a1);
std::cout << X.in_range(b0, b1) << std::endl;
b0 = 1.0;
std::cout << X.in_range(b0, b1) << std::endl;
b0 = 0.6;
std::cout << X.in_range(b0, b1) << std::endl;
}
您也可以按照您的原始代码设置 aX
。