使用 Math.sin 的周期函式

Math.sinMath.cos 是迴圈的,週期為 2 * PI 弧度(360 度),它們輸出幅度為 2 的波,範圍為 -1 到 1。

正弦和餘弦函式圖:( 維基百科提供)

它們對於許多型別的週期性計算都非常方便,從建立聲波到動畫,甚至編碼和解碼影象資料

此示例顯示如何建立一個簡單的正弦波,控制週期/頻率,相位,幅度和偏移。

使用的時間單位是秒。
最簡單的形式,僅控制頻率。

// time is the time in seconds when you want to get a sample
// Frequency represents the number of oscillations per second
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; // get phase at time
    t += phase * Math.PI * 2; // add the phase offset
    var v = Math.sin(t); // get the value at the calculated position in the cycle
    v *= amplitude; // set the amplitude
    v += offset; // add the 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; 
}

除時間之外的所有論據都是可選的