Math.sin并且Math.cos以2 * PI弧度(360度)的周期循环,它们输出振幅为2且在-1到1之间的波。
正弦和余弦函数图:(由维基百科提供)
从创建声波到动画,甚至编码和解码图像数据,它们对于许多类型的定期计算都非常方便
本示例说明如何创建简单的正弦波,并控制周期/频率,相位,幅度和偏移。
使用的时间单位是秒。
仅控制频率的最简单形式。
// time是要获取样本的时间(以秒为单位) // 频率代表每秒的振荡次数 function oscillator(time, frequency){ return Math.sin(time * 2 *Math.PI* frequency); }
在几乎所有情况下,您都需要对返回的值进行一些更改。修改的常用术语
相位:从振荡开始的频率偏移。该值在0到1的范围内,其中值0.5将波在时间上向前移动其频率的一半。值0或1不变。
幅度:一个周期内距最小值和最大值的距离。振幅1的范围为2。最低点(波谷)-1至最高(峰值)1。对于频率为1的波,峰值在0.25秒处,波谷在0.75秒处。
偏移:上下移动整个波形。
要将所有这些包括在函数中:
function oscillator(time, frequency = 1, amplitude = 1, phase = 0, offset = 0){ var t = time * frequency *Math.PI* 2; // 适时相 t += phase *Math.PI* 2; // 添加相位偏移 var v = Math.sin(t); // 获取周期中计算出的位置的值 v *= amplitude; // 设定振幅 v += offset; // 添加偏移量 return v; }
或以更紧凑的方式(且速度稍快一些):
function oscillator(time, frequency = 1, amplitude = 1, phase = 0, offset = 0){ return Math.sin(time * frequency *Math.PI* 2 + phase *Math.PI* 2) * amplitude + offset; }
除时间以外的所有参数都是可选的