JavaScript Fonctions périodiques utilisant Math.sin


Exemple

Math.sin et Math.cos sont cycliques avec une période de 2 * PI radians (360 deg), ils produisent une onde avec une amplitude de 2 dans la plage -1 à 1.

Graphique de la fonction sinus et cosinus: (avec la permission de Wikipedia)

Ils sont tous deux très pratiques pour de nombreux types de calculs périodiques, de la création d'ondes sonores aux animations, en passant par le codage et le décodage des données d'image.

Cet exemple montre comment créer une onde sinusoïdale simple avec contrôle sur période / fréquence, phase, amplitude et décalage.

L'unité de temps utilisée est les secondes.
La forme la plus simple avec contrôle de la fréquence uniquement.

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

Dans presque tous les cas, vous souhaiterez apporter des modifications à la valeur renvoyée. Les termes communs pour les modifications

  • Phase: Décalage en fréquence à partir du début des oscillations. C'est une valeur dans la plage de 0 à 1 où la valeur 0,5 déplace l'onde dans le temps de moitié de sa fréquence. Une valeur de 0 ou 1 ne change rien.
  • Amplitude: distance entre la valeur la plus basse et la valeur la plus élevée pendant un cycle. Une amplitude de 1 a une plage de 2. Le point le plus bas (creux) -1 au plus haut (pic) 1. Pour une onde de fréquence 1, le pic est à 0,25 seconde et le creux à 0,75.
  • Décalage: déplace la vague entière vers le haut ou le bas.

Pour inclure tous ces éléments dans la fonction:

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

Ou dans une forme plus compacte (et légèrement plus rapide):

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

Tous les arguments en dehors du temps sont optionnels