有单线函数生成三角波吗?


70

以类似的方式,产生锯齿波。它不必是连续的。

这是我的意思:

生成三个序列0..9,如下所示:

锯齿波图

请注意,峰右侧的斜率只是一个图形伪像

在这种情况下,单线为x = i ++%m


我想要的是:

三角波图

如果您知道另一种波形(正弦波,方波)的直线,那也很好。

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

将添加到三角波函数中以使线的斜度像这样弯曲或弯曲的是什么:

凸出波形

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


为什么他们必须成为“一线客”?

我想你的意思是x = x++ % m
Noldorin

1
@Neil因为我知道如何使用for循环和if语句来完成它们。我想要一种更优雅的方式来做这些事情。@Noldorin Newbie学习一些东西
willc2

@ willc2:我已经解决了您的问题。希望你不要介意。
Noldorin

(再次查看您的代码,我相信您的意思是真的x = i++ % m。)
Noldorin

Answers:



102

三角波

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

方波

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

正弦波

这给出了一个周期20 pi为3到-3的正弦波。


更新:

弯曲的三角波

要获得具有曲线而不是直线的三角波的变化,您只需要在方程中引入一个指数就可以使它成为二次方。

凹曲线(即x^2形状):

凹曲线(即sqrt(x)形状):

除了使用该pow函数之外,您还可以简单地定义一个square函数并在中使用该sqrt函数math.h,这可能会提高性能。

另外,如果要使曲线更陡峭/更浅,则只需尝试更改索引即可。


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


2
请注意,我的x与问题中的x不对应。这里使用的x I代表沿x轴的常规值,类似地,y代表沿y轴的值。这里的x似乎是您所问的i。
Noldorin

我可以添加这些波形以得到更复杂的波形,是吗?
willc2

1
三角波不是在3到0之间振荡吗?
基思·史密斯,

@ willc2:是的,当然。:)如果您想知道如何获取另一个特定的波形,请询问,我可以提出一些建议-但是这些提供了很好的起点。
Noldorin

1
@JoanVenge:常数的减法是偏移曲线的位置,以便其绕x轴对称。因此,实际上3是振幅(峰谷距离的一半,即6)。的pow(..., 2.0)是形成二次曲线。
Noldorin 2012年

41

扩展Eric Bainville的答案:

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

请注意,除非P是A的因数,否则y将是一个浮点数。是的,对于数学纯粹主义者:A在技术上是波幅的两倍,但是看下面的图片,您会明白我的理解。意思。

可视化:


7
这是一个更好的答案,完全是因为已记录在案。
Tullo_x86

周期与P相同,而不是一半:y =(A /(P / 2))*((P / 2)-abs(x%(2 *(P / 2)-P / 2))
Tweepy

9

我知道这是一篇旧文章,但对于任何正在寻找类似内容的人,我建议您关注一下。 http://en.wikipedia.org/wiki/Triangle_wave

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

要么。


1
OP指定该函数不必是连续的,但是如果确实需要对小数和负值起作用,则此版本很有用。
PeterT

1
还要注意,它输出负值和正值。
PeterT

该答案给出了一个简单的三角波形,而没有其他答案的所有调整。简洁明了,谢谢!
Syndog

6

改变波长只需要一个因数x

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


这导致“ V”波;您需要添加“ y = m-y”以获得三角波
bubaker

通常认为波是无限的,从而使“ V波”和三角波基本相同。但是到目前为止,如果f(0)= 0,则必须进行移位。
balpha


0

这是一个看起来像遥远的正弦近似值的周期函数;本质上,它是Sinuating抛物面,使用X平方:


-6

我已经通过一个简单的循环对其进行了测试,并且你们根本没有回答这个人的问题。剪切和粘贴不会帮助人们。难怪如此众多的大众媒体骗局取得了如此巨大的成功。与一个重复别人的错误的人一起,这不足为奇。人们甚至为这些错误答案给出正面的声誉率?难以置信的!但是,这再次与我先前的言论相吻合。

因此,首先,我们将向人们解释三角波是什么。好吧,它是一个波,其周期由两个相等的倾斜斜坡组成。与SAWTOOTH相反,斜面向上倾斜并且斜面与第一斜面相同,但是斜面向下倾斜,与SAWTOOTH相反,该斜面在反向翻折之后具有向上倾斜的斜面或向下倾斜的斜面。

PS:最后一位给出“ y(x)=(2a /π)ar​​csin(sin((2π/ p)* x))”的人太复杂了,我们正在寻找一种快速的c ++例程,因此绝对不应该使用三角函数问题。

测试程序:

(...)

=>我找到了一个资料来源,该资料可以用数学符号确切地说明答案: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 ++形式的对称三角函数声明的示例:

(...)

(...)

加油!


6
其他答案清晰明了,更直接地用“一个班轮”回答了这个问题。从问题本身来看,很明显OP知道什么是三角波,因此不确定为什么这对他们如此敌视。
路加·布里格斯

尽管其他答案很明确,但该答案确实是最简单易懂且执行最快的,因为它只涉及abs基础数学。但是,敌对是不必要的。
ValdaXD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.