无分支方式代表"乒乓球"价值?

Vit*_*meo 4 c++ math numbers function c++11

我需要一个不断变化的值,可以手动加强step()该往返一minmax,通过移动speed每一个step().

这是我目前的代码:

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; }
        }
};
Run Code Online (Sandbox Code Playgroud)

例:

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...
Run Code Online (Sandbox Code Playgroud)

我想有一种数学方法可以将其表示为无分支函数,但我无法弄明白.我尝试使用modulo,但我仍然需要一个dir变量来改变步进方向.

Pau*_*ans 5

你可以用一个数组做这样的事情(警告:可能有很多错误!):

int total_steps = 2*(max - min + 1)/speed; // this may be wrong -- have to double check
T steps[total_steps];
for(int i = 0; i < max - min; ++i)
    steps[total_steps - i] = steps[i] = min + i*speed;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用modulo total_steps永远地遍历数组.