使用 Math.sin 的周期函式
Math.sin
和 Math.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;
}
除時間之外的所有論據都是可選的