【问题标题】:How to avoid "trap" with linear interpolation?如何避免线性插值的“陷阱”?
【发布时间】:2017-06-08 22:55:13
【问题描述】:

我有一个范围 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 长度。但是当我到达那个范围时,我得到了一个“陷阱”的值,并且无法返回。 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) =&gt; b1)。

我怎样才能避免这种情况?

【问题讨论】:

    标签: c++ linear-interpolation


    【解决方案1】:

    我怎样才能避免这种情况?

    不存储实际值,而是存储范围内的相对位置:

    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

    【讨论】:

    • 什么是 normalized_offset?
    • 存储(基本上)值所在范围从开始到结束距离的百分比的成员。 0是开头,1是结尾。
    • 现在确定如何将 make_value_in_range 的返回值存储到 normalized_offset :O
    猜你喜欢
    • 2010-11-16
    • 2019-07-14
    • 1970-01-01
    • 2015-04-08
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多