Calculer la courbe sinusoïdale en C

Aug 16 2020

Je veux obtenir une valeur périodique qui se déplace entre 0 et une hauteur spécifiée (dans mon cas, c'est 40) à partir de la courbe sinusoïdale.

Mais je gâche quelque chose, car ma valeur va jusqu'à 79 au lieu des 40 attendus. Qu'est-ce que je fais de mal?

Voici ma tentative:

#include <math.h>

    #define degToRad(angleInDegrees) ((angleInDegrees)*M_PI / 180.0)
    
    int main()
    {  
        int height = 40;
        int i = 0;
        while (1) {
    
            int value = height + sin(degToRad(i / 2 + 1)) * height;
            printf("val = %i\n", value);
            i++;
        }
        return 0;
    }

Réponses

2 chux-ReinstateMonica Aug 16 2020 at 03:34

Une résolution directe consiste à diviser la magnitude de l'onde par 2 @Eric Postpischil

// int value = height + sin(degToRad(i / 2 + 1)) * height; 
int value = height + sin(degToRad(i / 2 + 1)) * height)/2;

et utilisez les mathématiques en virgule flottante dans la i/2division. @bruno


J'attends un résultat plus acceptable en utilisant l'arrondi plutôt que la troncature (ce que fait le code d'OP) allant de la virgule flottante à int.

int value = height + lround(sin(degToRad(i / 2 + 1)) * height)/2);
2 Hi-IloveSO Aug 16 2020 at 03:26

L'amplitude de la courbe serait alors height / 2et non height; remplacez simplement

int value = height + sin(degToRad(i / 2 + 1)) * height;

avec

int value = height / 2 + sin(degToRad(i / 2 + 1)) * height / 2;

Une bonne façon de s'en souvenir est que sin x est toujours compris entre [-1, 1].