所以,我有没有任何范围的弧度角(基本上是 -inf 到 +inf),我需要尽快对它们进行插值。如果有什么千篇一律的方法可以做到这一点?
PS:我一次只需要插入2个值,所以a+f*(ba)基本上
PPS:输出不必在任何特定范围内(-PI 到 PI 或 0 到 2PI)
PPPS:具体问题是如何最有效地包装 -PI/+PI 及其倍数周围的值
所以,我有没有任何范围的弧度角(基本上是 -inf 到 +inf),我需要尽快对它们进行插值。如果有什么千篇一律的方法可以做到这一点?
PS:我一次只需要插入2个值,所以a+f*(ba)基本上
PPS:输出不必在任何特定范围内(-PI 到 PI 或 0 到 2PI)
PPPS:具体问题是如何最有效地包装 -PI/+PI 及其倍数周围的值
BETTER其实忘了我先写的。你可以简单地做:
template<typename K>
K lerpAngle(K u, K v, K p) {
return u + p*wrapMP(v - u);
}
其中wrapMP
将角度移动到区间 [-pi|+pi]。输入u
和v
都可以是任何弧度角,结果也不会在特定区间内。
这个想法其实很简单。将您的观点移动到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[.
首先,“标准化”您的输入角度,使它们处于特定范围内,例如(-π, π]
. 如果您已经这样做了,请跳过这一部分。
然后,拿他们的不同。如果该差值的绝对值大于 ,π
则通过加/减调整其中一个输入,2π
使差值的绝对值小于或等于π
。
然后简单地在这两个值之间进行插值。
如果此插值的输出应始终(-π, π]
再次在该范围内(注意:它可能不必,具体取决于您需要此角度的位置),2π
如果不是,则再次加/减。