C++ 在弧度之间插值的最快方法?

C++ 在弧度之间插值的最快方法?,c++,interpolation,radians,C++,Interpolation,Radians,所以,我有没有任何范围的弧度角(-inf到+inf基本上),我需要尽可能快地插值这些。如果有什么方法可以做到这一点 PS:我一次只需要插值2个值,所以a+f*(b-a)基本上 PPS:输出不必在任何特定范围内(-PI到PI或0到2PI) 购买力平价:具体问题是如何最有效地包装-PI/+PI及其倍数周围的值。您可以简单地执行以下操作: template<typename K> K lerpAngle(K u, K v, K p) { return u + p*wrapMP(v

所以,我有没有任何范围的弧度角(-inf到+inf基本上),我需要尽可能快地插值这些。如果有什么方法可以做到这一点

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

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


购买力平价:具体问题是如何最有效地包装-PI/+PI及其倍数周围的值。您可以简单地执行以下操作:

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

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

更好实际上忘记了我首先写的内容。您可以简单地执行以下操作:

template<typename K>
K lerpAngle(K u, K v, K p) {
    return u + p*wrapMP(v - u);
}
wrap2i
将角度移动到间隔[0,2*pi[.

时,首先“规范化”输入角度,使其处于特定范围内,如
(-π,π]
。如果已经这样做,则跳过这部分

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

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

如果此插值的输出应始终在
(-π,π)
范围内(注意:根据需要此角度的位置,可能不必如此),则如果不在范围内,则再次添加/减去

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

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

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


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

内联编写公式并信任您的编译器。不清楚的问题-请详细说明您的问题“如何在数学上插值角度?”或“如何使我的方法(插入代码)更有效?”a+f*(b-a)有什么问题吗?我不确定如何最好地管理-PI/PI边的环绕。内联编写公式并信任您的编译器。不清楚的问题-请回答您的问题”如何用数学方法插值角度?”或“如何使我的方法(插入代码)更有效?”a+f*(b-a)有什么问题?我不确定如何最好地管理-PI/PI边的缠绕。这就是我所想的,没有更好的方法做到这一点:(我想不是,丹维尔的答案基本相同,但是代码而不是文字;)好吧,我就是这么想的,没有更好的方法可以做到这一点:(我想不是,丹维尔的答案也差不多,但是代码而不是文字;)你为什么
static\u cast(p)
p
已经是
K
类型时?如果(d>=+PI){b-=2*PI;}@leemes:完全正确!这是一个遗留问题,因为在原始代码中
p
可能有不同的类型。@user1071988:我认为这不重要。如果距离正好是PI(即180度),则可以向左或向右插值。当
p
已经是
K
类型时,为什么要
static\u cast(p)
呢?如果(d>=+PI){b-=2*PI;}@里姆斯:完全正确!这是一个遗留问题,因为在原始代码中,
p
可以有不同的类型。@user1071988:我认为这没关系。如果距离正好是π(即180度),则可以向左或向右插值。