したがって、範囲のないラジアン角 (基本的に -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 とその倍数を最も効率的に値をラップする方法です。
ベター実際に私が最初に書いたことを忘れてください。あなたは簡単に行うことができます:
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
角度は正規化されていないため、任意に設定できますが、距離を [-pi|+pi] にラップし、指定されたパーセンテージでその方向にv-u = v
歩きます。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));
}
ここでwrap2i
、角度を間隔 [0,2*pi[] に移動します。
まず、入力角度を「正規化」して、 のように特定の範囲に収めます(-π, π]
。すでにこれを行っている場合は、この部分をスキップしてください。
次に、それらの違いを取ります。この差の絶対値が より大きい場合は、差の絶対値が より小さいか等しくなるようπ
に、入力の 1 つを加算/減算して調整します。2π
π
次に、これらの 2 つの値の間を単純に補間します。
この補間の出力が常に範囲内にある必要がある場合(-π, π]
(注: この角度が必要な場所によっては、おそらくそうである必要はありません)、2π
そうでない場合は再度追加/減算します。