c++ - 表示 "ping-pong"值的无分支方式?

标签 c++ function math c++11 numbers

我需要一个可以通过 step() 手动步进的变化值,它来回 min max,每 step()speed 移动。

这是我当前的代码:

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; }
        }
};

例子:

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...

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

最佳答案

你可以用一个数组来做到这一点,就像这样(警告:可能有大量的差一错误!):

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;

然后您可以使用模 total_steps 永远遍历数组。

关于c++ - 表示 "ping-pong"值的无分支方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18978330/

相关文章:

c++ - 用于在 C++ 中包装整数的干净、高效的算法

python - 最有效的方法找到 3 个数字的最大公约数?

javascript - 如何在 JS 中平滑地舍入百分比

c++ - Visual Studio /C++ : Build of non-dependant project built on launching debug mode

c++ - C++ 图形库

c++ - 无效使用不完整类型 'class …' STL vector

c - 存储一个 Lua 函数?

"__"函数的 Python 奇怪覆盖行为

c++ - 非聚合不能用初始化列表初始化

r - 在数据框中的多列上使用shapiro.test