如何避免线性插值"trap"?
How to avoid "trap" with linear interpolation?
i具有范围a
(起始范围(和范围b
(目标范围(,并且我需要将值aX
从范围a
缩放到范围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。但是,当我到达该范围时,我得到了一个"陷阱"的价值,无法返回。这是一个例子:
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,因为X = a1
,因此始终是b0 + (b1 - b0) => b1
(。
如何避免这种情况?
如何避免这种情况?
不要存储实际值,而是在范围内的相对位置:
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
。
相关文章:
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 升压插值条件变量可以虚假唤醒吗?
- 如何获得插值极坐标?
- 如何线性插值到不恒定的目的地
- 向心Catmull-Rom样条曲线插值alpha参数
- 使用 OpenGL 插值数据缓冲区?
- 缩放和插值数组
- 骨骼动画:变换矩阵(collada)之间的插值
- 从一组点C++平面插值
- 从 C++14 到 C++98 的端口字符串插值
- 将矢量的数据扩展到指定大小(插值)
- 双线性插值实现的错误
- 如何避免线性插值"trap"?
- 使用 DirectX 11 插值背景颜色?
- OpenGL 缺陷 - 不需要的插值
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 将 N 个公式替换为一个(字符串插值)
- C++ - 处理几何插值中的浮点误差
- 双三次插值结果与FFMPEG不同