1

所以,我有没有任何范围的弧度角(基本上是 -inf 到 +inf),我需要尽快对它们进行插值。如果有什么千篇一律的方法可以做到这一点?

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

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

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

4

2 回答 2

4

BETTER其实忘了我先写的。你可以简单地做:

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

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

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


旧(而且效率低下)我曾经写过这段代码:

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));
}

wherewrap2i将角度移动到区间 [0,2*pi[.

于 2013-12-29T14:21:35.463 回答
3

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

然后,拿他们的不同。如果该差值的绝对值大于 ,π则通过加/减调整其中一个输入,使差值的绝对值小于或等于π

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

如果此插值的输出应始终(-π, π]再次在该范围内(注意:它可能不必,具体取决于您需要此角度的位置),如果不是,则再次加/减。

于 2013-12-29T14:22:10.247 回答