是否有一个生成三angular波的单线函数?

以类似的方式产生一个锯齿波。 它不一定是连续的。

这里是我的意思:

int m = 10; int x = 0; int i = 0; while (i < m*3) { printf("%d ", x); x++; x = x % m; i++; } 

生成一个序列0..9,三次,看起来像这样:

锯齿波形图

请注意,峰顶右侧的斜坡只是一个graphics工件

在这种情况下的单线是x = i ++%m


我想要的是这样的:

三角波形图

如果你知道其他波形(正弦,方形)的单线,那也是很好的了解。

更新 :每个人的答案都非常有帮助,我有一个后续问题。

什么将被添加到三angular波function,使这样的线的斜率曲线进出:

鼓起的波形

谢谢大家 ,各种各样的答案帮助我从更大的angular度看待问题。 特别感谢Noldorin提出将方程扩展到二次曲线。

 x = m - abs(i % (2*m) - m) 

三angular波

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

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

方波

 y = (x++ % 6) < 3 ? 3 : 0; 

这给出了周期为6的规则方波,在3和0之间振荡。

正弦波

 y = 3 * sin((float)x / 10); 

这给出了一个周期20 pi的正弦波,在3和-3之间振荡。


更新:

弯曲的三angular波

为了得到具有曲线而不是直线的三angular波的变化,只需要在方程中引入一个指数使其成为二次方。

凹曲线(即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函数,这可能会提高性能。

另外,如果你想让曲线更陡峭/更浅,就试试改变指数。


在所有这些情况下,您应该能够轻松地调整常量并在正确的位置添加比例因子,以给出给定波形的变化forms(不同的周期,放大率,不对称性等)。

扩大Eric Bainville的答案:

 y = (A/P) * (P - abs(x % (2*P) - P) ) 

其中x是运行整数,y是三angular波输出。 A是波的幅度,P是半周期。 例如,A = 5会产生一个从0到5的波; P = 10将产生周期为20的波。当x = 0时,波从y = 0开始。

请注意,y将是一个浮点数,除非P是A的因子。是的,对于math纯粹主义者来说:A在技术上是波的幅度的两倍,但看看下面的图片,你就会明白我意思。

可视化:

 y = abs( amplitude - x % (2*amplitude) ) 

改变波长只需要一个因素为x

编辑:我所说的幅度实际上不是幅度,而是最大值(即5如果曲线在0和5之间振荡)。 math意义上的幅度是其的一半。 但是你明白了。

我知道这是一个旧的职位,但任何人正在寻找类似的东西,我build议看看。 http://en.wikipedia.org/wiki/Triangle_wave

最后的公式y(x)=(2a /π)ar​​csin(sin((2π/ p)* x))

要么。

 (2 * amplitudeConstant / Math.PI) * Math.Asin(Math.Sin(2 * (Math.PI / periodConstant) * Convert.ToDouble(variableX))) 

尝试这个:

 x = m - abs(m - 2*(i++ % m)) 

这是一个周期性的函数,看起来像一个远距离的正弦逼近; 基本上它是一个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; } 

我用一个简单的循环testing了它,你们根本没有回答这个男人的问题。 剪切和粘贴不会帮助人。 难怪这么多的大众媒体恶作剧有这么多的成功。 一个重复别人的错误的人不会感到意外。 而人们甚至为这些错误的答案给予正面的声誉。 难以置信的! 但是,这又和我以前的评论一致。

所以首先我们要向我们的人们解释一下三angular波是什么。 那么这是一个由两个相等的斜坡组成的时期。 一个坡道向上倾斜,一个坡道与第一个坡道相同,但是向下倾斜,与斜坡向上倾斜的SAWTOOTH相反,或者在反转的塔罗德之后重复坡道向下倾斜。

PS:最后一个给出“y(x)=(2a /π)ar​​csin(sin((2π/ p)* x))”的代码太复杂了,我们正在寻找一个快速的c ++程序,所以三angular函数绝对不在这个问题。

testing程序:

(……)

 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) 

=>我find一个资料来源,用math符号表示答案是什么: http : //mathworld.wolfram.com/TriangleWave.html

我已经在一个名为KmPlot的Linux程序上testing了这个公式。 Linux用户可以通过根terminalinputapt-get install kmplot来获得kmplot,如果这样做不起作用,请尝试使用常规terminal并键入sudo apt-get install kmplot,如果这样做不起作用,请观看此youtubevideo安装Linux程序http://www.youtube.com/watch?v=IkhcwxC0oUg

所以对线程问题的一个正确答案就是以下所示的c ++forms的对称三angular函数声明的一个例子:

(……)

 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!