以类似的方式 modulo 生成锯齿波。它不必是连续的。
这就是我的意思:
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将方程扩展到二次曲线。
答案 0 :(得分:87)
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
函数并使用sqrt
中的math.h
函数,这可能会稍微提高性能。< / p>
此外,如果您想使曲线更陡/更浅,只需尝试更改索引。
在所有这些情况下,您应该能够轻松调整常数并在正确的位置添加缩放因子,以给出给定波形的变化(不同的周期,放大,不对称等)。
答案 1 :(得分:30)
扩展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在技术上是波的幅度的两倍,但是看下面的图片,你就会理解我的意思。
可视化:
答案 2 :(得分:22)
x = m - abs(i % (2*m) - m)
答案 3 :(得分:5)
y = abs( amplitude - x % (2*amplitude) )
更改波长只需要x
的因子。
编辑:我称之为幅度实际上不是幅度,而是最大值(即曲线在0和5之间振荡时为5)。数学意义上的振幅是其中的一半。但你明白了。
答案 4 :(得分:5)
我知道这是一个老帖子,但是对于那些正在寻找类似东西的人我建议看一下。 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)))
答案 5 :(得分:0)
试试这个:
x = m - abs(m - 2*(i++ % m))
答案 6 :(得分:0)
这是一个周期函数,看起来像一个遥远的正弦近似;基本上它是一个Sinuating抛物面,使用X平方:
function xs ( xx : float ): float{
var xd =Mathf.Abs((Mathf.Abs(xx) % 2.4) - 1.2);
if ( Mathf.Abs(Mathf.Abs(xx) % 4.8) > 2.4){
xd=(-xd*xd)+2.88;
}else{
xd = xd*xd;
}
return xd;
}
答案 7 :(得分:-2)
我用一个简单的循环测试了它,你们根本没有回答这个男人的问题。剪切和粘贴对人们无济于事。难怪这么多大众传媒骗局取得如此大的成功。有一个人重复别人的错误,这是不容错过的。人们甚至会给出这些错误答案的正面声誉率?!难以置信的!但同样,这与我之前的评论相似。
首先,我们将向我们的人们解释一下三角波是什么。那么它是一个波浪,其周期由两个相等的斜坡组成。斜坡向上倾斜,斜坡与第一斜坡倾斜,但倾斜向下倾斜,与SAWTOOTH相反,斜坡倾斜向上倾斜或倾斜倾斜向下倾斜后反复滑动。
PS:最后一个给出“y(x)=(2a /π)arcsin(sin((2π/ p)* x))”的人太复杂了,我们正在寻找一个快速的c ++例程,所以三角学是绝对不可能。测试程序:
(...)
for (byte V=0; V<255; V++)
{
unsigned int x = evenramp(V);
plotRGB(0,0,x,x,x);
delay(100); // make sure you have your own delay function declared of course
/* use your own graphic function !!! plotRGB(row,column,R,G,B) */
/* the light intensity will give you the change of value V in time */
/* all functions suggested as answer give SAWTOOTH and NOT TRIANGLE */
/* it is a TRIANGLE the man wants */
}
float triangleattempt(unsigned int x) // place any answered formula after '255 *' behind return.
{
return 255 * (255 - abs(255 - 2*(x % 255))); // this will show a SAWTOOTH
}
//All given answers up to now excluding "function xs ( xx : float ): float" (this is not the requested one-liner, sorry) that are not a symmetrical triangle wave
// m - abs(i % (2*m) - m); (this is still a SAWTOOTH wave and not a TRIANGLE wave)
// abs((x++ % 6) - 3); (this is still a SAWTOOTH wave and not a TRIANGLE wave)
// abs(amplitude - x % (2*amplitude)); (this is still a SAWTOOTH wave and not a TRIANGLE wave)
=&GT;我找到了一个来源,它准确地说明了数学符号中的答案:http://mathworld.wolfram.com/TriangleWave.html
我在一个名为KmPlot的Linux程序中测试了该公式。 Linux用户可以通过root终端键入apt-get install kmplot获取kmplot,如果不起作用,请尝试使用常规终端并输入sudo apt-get install kmplot,如果不起作用,请观看此youtube视频以获取一般说明安装Linux程序http://www.youtube.com/watch?v=IkhcwxC0oUg
线程问题的正确答案是c ++形式的对称三角形函数声明的示例,如下所示:
(...)
int symetrictriangle(float x)
{
unsigned int period = 30; // number of increases of x before a new cycle begins
unsigned int amplitude = 100; // top to bottom value while the bottom value is always zero
return amplitude * 2 * abs(round(x/period)-(x/period));
}
(...)
Cheerz!