以类似的方式,模数生成锯齿波.它不必是连续的.
这就是我的意思:
int m = 10;
int x = 0;
int i = 0;
while (i < m*3) {
printf("%d ", x);
x++;
x = x % m;
i++;
}
Run Code Online (Sandbox Code Playgroud)
生成一个序列0..9,三次,如下所示:
请注意,峰值右侧的斜率只是一个图形伪影
在这种情况下,单线是x = i ++%m
我想要的是这个:
如果你知道其他波形的单线(正弦波,方波),那么也应该知道.
更新:每个人的答案都非常有用,我有一个后续问题.
将添加到三角波函数中以使线的斜率曲线变为或变为这样:
谢谢大家,您的各种答案帮助我从更大的角度看问题.特别感谢Noldorin将方程扩展到二次曲线.
Nol*_*rin 90
y = abs((x++ % 6) - 3);
Run Code Online (Sandbox Code Playgroud)
这给出了周期6的三角波,在3和0之间振荡.
y = (x++ % 6) < 3 ? 3 : 0;
Run Code Online (Sandbox Code Playgroud)
这给出了周期6的规则方波,在3和0之间振荡.
y = 3 * sin((float)x / 10);
Run Code Online (Sandbox Code Playgroud)
这给出了一个正弦波周期20 pi
,在3和-3之间振荡.
更新:
要获得具有曲线而不是直线的三角波的变化,您只需要在方程中引入一个指数使其成为二次方程.
凹曲线(即x^2
形状):
y = pow(abs((x++ % 6) - 3), 2.0);
Run Code Online (Sandbox Code Playgroud)
凹曲线(即sqrt(x)
形状):
y = pow(abs((x++ % 6) - 3), 0.5);
Run Code Online (Sandbox Code Playgroud)
或者使用该pow
函数,您可以简单地定义一个square
函数并使用sqrt
函数math.h
,这可能会提高性能.
此外,如果您想使曲线更陡/更浅,只需尝试更改索引.
在所有这些情况下,您应该能够轻松地调整常数并在正确的位置添加缩放因子,以给出给定波形的变化(不同的周期,放大,不对称等).
Lig*_*der 37
扩展Eric Bainville的答案:
y = (A/P) * (P - abs(x % (2*P) - P) )
Run Code Online (Sandbox Code Playgroud)
其中x是运行整数,y是三角波输出.A是波的幅度,P是半周期.例如,A = 5将产生一个从0到5的波; P = 10将产生周期为20的波.对于x = 0,波在y = 0处开始.
请注意,除非P是A的因子,否则y将是一个浮点数.而且,是的,对于数学纯粹主义者:A在技术上是波的幅度的两倍,但是看下面的图片,你会明白我的意思意思.
可视化:
小智 7
我知道这是一个老帖子,但是对于那些正在寻找类似的东西的人我建议看一下. http://en.wikipedia.org/wiki/Triangle_wave
最后一个公式y(x)=(2a /π)arcsin(sin((2π/ p)*x))
要么.
(2 * amplitudeConstant / Math.PI) * Math.Asin(Math.Sin(2 * (Math.PI / periodConstant) * Convert.ToDouble(variableX)))
Run Code Online (Sandbox Code Playgroud)
y = abs( amplitude - x % (2*amplitude) )
Run Code Online (Sandbox Code Playgroud)
改变波长只需要一个因素x
.
编辑:我称之为幅度实际上不是幅度,而是最大值(即曲线在0和5之间振荡时为5).数学意义上的振幅是其中的一半.但你明白了.