在弧度之间进行插值的最快方法?

时间:2013-12-29 14:09:16

标签: c++ interpolation radians

所以,我的弧度没有任何范围(基本上是-inf到+ inf),我需要尽可能快地插入这些。如果有任何千篇一律的方法吗?

PS:我只需要一次插值2个值,所以a + f *(b-a)基本上

PPS:输出不必在任何特定范围内(-PI到PI或0到2PI)

PPPS:具体问题是如何围绕-PI / + PI及其倍数最有效地包装值

2 个答案:

答案 0 :(得分:4)

更好实际上忘记了我先写的内容​​。你可以这样做:

template<typename K>
K lerpAngle(K u, K v, K p) {
    return u + p*wrapMP(v - u);
}

其中wrapMP将角度移动到间隔[-pi | + pi]。输入uv都可以是任何弧度角,结果也不会在特定的时间间隔内。

这个想法其实很简单。将您的观点移至uu=0。现在v可以是任意的,因为角度没有标准化,但我们只是将距离v-u = v包裹到[-pi | + pi]并按给定的百分比p走向该方向。 / p>


OLD(效率低下)我写了一次这段代码:

template<typename K>
K lerpAngle(K u, K v, K p) {
    K a = wrap2Pi(u);
    K b = wrap2Pi(v);
    K d = b - a;
    if(d < -PI) {
        b += 2*PI;
    }
    if(d > +PI) {
        b -= 2*PI;
    }
    return wrap2Pi(a + p*(b - a));
}

其中wrap2i将角度移动到区间[0,2 * pi [。

答案 1 :(得分:3)

首先,“标准化”您的输入角度,使它们处于特定范围内,例如(-π, π]。如果您已经这样做,请跳过此部分。

然后,采取他们的差异。如果此差异的绝对值大于π,则通过添加/减去来调整其中一个输入,使得差异的绝对值变得小于或等于π。< / p>

然后简单地在这两个值之间进行插值。

如果此插值的输出应始终在(-π, π]范围内(注意:它可能不需要,取决于您需要此角度的位置),然后添加/减去如果不是那样的话。