4

I need a changing value that can be manually stepped with step() that goes back and forth a min and a max, moving by speed every step().

This is my current code:

template<typename T> struct PingPongValue {
        T value, min, max, speed, dir{1};

        PingPongValue(T mMin, T mMax, T mSpeed) 
           : value(mMin), min(mMin), max(mMax), speed(mSpeed) { }

        void step()
        {
            value += speed * dir;
                 if(value > max) { value = max; dir = -1; }
            else if(value < min) { value = min; dir = +1; }
        }
};

Example:

PingPongValue v{0, 5, 1};
v.step(); // v.value == 1
v.step(); // v.value == 2
v.step(); // v.value == 3
v.step(); // v.value == 4
v.step(); // v.value == 5
v.step(); // v.value == 4
v.step(); // v.value == 3
v.step(); // v.value == 2
// etc...

I suppose there's a mathematical way to represent this as a branchless function, but I cannot figure it out. I tried using modulo but I still need a dir variable to change step direction.

4

7 に答える 7

2

実際、sin(x) のような周期関数を採用し、それを目的のスケールに正規化する必要があります。たとえば、三角波: http://en.wikipedia.org/wiki/Triangle_wave

もう 1 つのアプローチ (単純なケースではより好ましい) は、事前に計算された結果の配列を使用し、それらを反復処理する (そして mod 関数を使用してインデックス オーバーフローを処理する) ことです。

于 2013-09-24T10:05:43.937 に答える
1
        int min = 2;
        int max = 7;
        int step = 1;

        int d = max - min;
        int n = d;

        for( int i = 0; min<1000; ++i)
        {
            int x = min + abs(d - n); // the result
            n = (n + step) % (2 * d); // the step
        }
于 2013-09-24T13:55:13.630 に答える
0

これが疑似コードでの私の考えですが、保証はありません:)これは、あなたの例が行うことをエミュレートする必要がありますが、コードが行うことではありません。つまり、シリーズ 1、2、3、4、5、4、3、2、1、2、... を作成する必要がありますが、コードでは 1、2、3、4、5、5、4、 3、2、1、1、2、...

コメントは、min=1、max=5、speed=1 の動作を示しています。

size = max-min; // 4
internalValue = (internalValue + speed) % (size*2); // 0, 1, ..., 7, 0, 1, ...
reverse = internalValue / size; // 0 for internalValue in [0, 3], 1 for [4, 7]
value = min + internalValue - 2*reverse*(internalValue - size);

ここでは internalValue が唯一の実際の状態変数です。

于 2013-09-24T10:25:46.090 に答える