是否有一个生成三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 /π)arcsin(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 /π)arcsin(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!