JavaScript 使用Math.sin的周期函数

示例

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; 
}

除时间以外的所有参数都是可选的