Calculer la courbe sinusoïdale en C
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
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/2
division. @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);
L'amplitude de la courbe serait alors height / 2
et 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].