1

したがって、範囲のないラジアン角 (基本的に -inf から +inf まで) があり、これらをできるだけ早く補間する必要があります。これを行うクッキーカッターの方法があれば?

PS: 一度に 2 つの値を補間するだけでよいので、基本的に a+f*(ba)

PPS: 出力は特定の範囲内である必要はありません (-PI から PI または 0 から 2PI)。

PPPS: 具体的な問題は、-PI/+PI とその倍数を最も効率的に値をラップする方法です。

4

2 に答える 2

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=0v角度は正規化されていないため、任意に設定できますが、距離を [-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[] に移動します。

于 2013-12-29T14:21:35.463 に答える
3

まず、入力角度を「正規化」して、 のように特定の範囲に収めます(-π, π]。すでにこれを行っている場合は、この部分をスキップしてください。

次に、それらの違いを取ります。この差の絶対値が より大きい場合は、差の絶対値が より小さいか等しくなるようπに、入力の 1 つを加算/減算して調整します。π

次に、これらの 2 つの値の間を単純に補間します。

この補間の出力が常に範囲内にある必要がある場合(-π, π](注: この角度が必要な場所によっては、おそらくそうである必要はありません)、そうでない場合は再度追加/減算します。

于 2013-12-29T14:22:10.247 に答える