Есть ли треугольная волновая функция?
В 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 ответа
Я думал, что мы должны по крайней мере опубликовать правильный ответ здесь, прежде чем этот вопрос будет закрыт, потому что это дубликат.
Эрик Бэйнвил ответ правильный.
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
Похоже, что на очень похожий вопрос здесь был дан ответ: есть ли однострочная функция, которая генерирует треугольную волну?
Взято у Нолдорина ответ:
Треугольная волна
y = abs((x++ % 6) - 3);
Это дает треугольную волну периода 6, колеблющуюся между 3 и 0.
Теперь поместите это в функцию:
int foo(int inputPosition, int period, int amplitude)
{
return abs((inputPosition % period) - amplitude);
}
Вы должны сделать свой собственный:
// 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;
}