所以,我的弧度没有任何范围(基本上是-inf到+ inf),我需要尽可能快地插入这些。如果有任何千篇一律的方法吗?
PS:我只需要一次插值2个值,所以a + f *(b-a)基本上
PPS:输出不必在任何特定范围内(-PI到PI或0到2PI)
PPPS:具体问题是如何围绕-PI / + PI及其倍数最有效地包装值
答案 0 :(得分:4)
更好实际上忘记了我先写的内容。你可以这样做:
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
走向该方向。 / 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)
首先,“标准化”您的输入角度,使它们处于特定范围内,例如(-π, π]
。如果您已经这样做,请跳过此部分。
然后,采取他们的差异。如果此差异的绝对值大于π
,则通过添加/减去2π
来调整其中一个输入,使得差异的绝对值变得小于或等于π
。< / p>
然后简单地在这两个值之间进行插值。
如果此插值的输出应始终在(-π, π]
范围内(注意:它可能不需要,取决于您需要此角度的位置),然后添加/减去2π
如果不是那样的话。