以类似的方式,模数产生锯齿波。它不一定是连续的。
我的意思是:
int m = 10;
int x = 0;
int i = 0;
while (i < m*3) {
printf("%d ", x);
x++;
x = x % m;
i++;
}
生成一个序列0..9,三次如下所示:
请注意,山峰右侧的坡度只是一个图形伪像。
本例中的一行代码是x = i++ % m
我想要的是:
如果你知道其他波形(正弦,方波)的单行代码,那也是很好的了解。
更新:每个人的回答都非常有帮助,我有一个后续问题。
在三角波函数中添加什么,以使直线的斜率像这样曲线:
感谢每个人,,你多种多样的答案帮助我从一个更大的角度来看待这个问题。特别感谢Noldorin将方程扩展到二次曲线。
发布于 2009-07-02 10:28:15
x = m - abs(i % (2*m) - m)
发布于 2009-07-02 10:28:59
三角波
y = abs((x++ % 6) - 3);
这给出了一个周期为6的三角波,在3和0之间振荡。
方波
y = (x++ % 6) < 3 ? 3 : 0;
这给出了一个周期为6的规则方波,在3和0之间振荡。
正弦波
y = 3 * sin((float)x / 10);
这给出了一个周期为20 pi
的正弦波,在3和-3之间振荡。
更新:
曲线型三角波
要得到具有曲线而不是直线的三角波的变体,您只需在方程中引入一个指数,使其成为二次。
凹曲线(即x^2
形状):
y = pow(abs((x++ % 6) - 3), 2.0);
凹曲线(即sqrt(x)
形状):
y = pow(abs((x++ % 6) - 3), 0.5);
或者使用pow
函数,您可以简单地定义一个square
函数并在math.h
中使用sqrt
函数,这可能会稍微提高性能。
此外,如果你想让曲线变得更陡峭/更浅,只需尝试更改索引即可。
在所有这些情况下,您应该能够轻松地调整常数并在正确的位置添加缩放因子,以给出给定波形的变化(不同的周期、振幅、不对称性等)。
发布于 2014-03-14 17:24:32
扩展Eric Bainville的答案:
y = (A/P) * (P - abs(x % (2*P) - P) )
其中x是运行整数,y是三角波输出。A是波的振幅,P是半周期。例如,A=5将产生一个从0到5的波;P=10将产生一个周期为20的波。对于x=0,该波从y=0开始。
请注意,y将是一个浮点数,除非P是A的一个因子。是的,对于数学纯粹主义者来说:从技术上讲,A是波的振幅的两倍,但看看下面的图片,你就会明白我的意思。
可视化:
https://stackoverflow.com/questions/1073606
复制相似问题