有三角波功能吗?

时间:2015-02-18 16:13:38

标签: c++ loops for-loop geometry sine-wave

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

我希望函数返回一个三角波,所以对于某些函数foo

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

会导致:

  

0
  1
  2
  1
  0
  0
  1
  2
  1
  0

是否有这样的功能,或者我需要提出自己的功能吗?

3 个答案:

答案 0 :(得分:2)

在这里看到一个非常相似的问题:Is there a one-line function that generates a triangle wave?

取自Noldorin回答:

三角波

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

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

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

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

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

答案 2 :(得分:0)

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

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