有三角波函数吗?

Is There a Triangle Wave Function?

for 循环中使用 % 获得锯函数,例如使用 5 打印 2 个周期的周期将如下所示:

for(auto i = 0; i < 5 * 2; ++i) cout << i % 5 << endl;

结果:

0
1
2
3
4
0
1
2
3
4

我想要一个函数 returns 三角波,所以对于某些函数 foo:

for(auto i = 0; i < 5 * 2; ++i) cout << foo(i, 5) << endl;

会导致:

0
1
2
1
0
0
1
2
1
0

有没有这样的功能,还是需要我自己想出来?

你必须自己制作:

// Assumes 0 <= i < n
int foo(int i, int n) {
    int ix = i % n;
    if ( ix < n/2 )
        return ix;
    else
        return n-1-ix;
}

这里似乎回答了一个非常相似的问题:Is there a one-line function that generates a triangle wave?

摘自诺多语答案:

三角波

y = abs((x++ % 6) - 3);

这给出了一个周期为 6 的三角波,在 3 和 0 之间振荡。

现在把它放在一个函数中:

int foo(int inputPosition, int period, int amplitude)
{
    return abs((inputPosition % period) - amplitude);
}

我认为我们至少应该 post 在这个问题关闭之前在这里给出正确答案,因为它是重复的。

Eric Bainvile's answer 是正确的。

int foo(const int position, const int period){return period - abs(position % (2 * period) - period);}

然而,这给出了范围为 [0, period] 和频率为 2 * period 的三角波,我想要范围为 [0, period / 2] 和period 的循环。这可以通过将一半的周期传递给 foo 或通过调整函数来实现:

int foo(const int position, const int period){return period / 2 - abs(position % period - period / 2);}

对于这样一个简单的函数,内联似乎更可取,所以我们的最终结果将是:

for(auto position = 0; position < 5 * 2; ++position) cout << 5 / 2 - abs(position % 5 - 5 / 2) << endl;

产生请求:

0
1
2
1
0
0
1
2
1
0