Calcola la curva sinusoidale in C
Voglio ottenere un valore periodico che si sposti tra 0 e un'altezza specificata (nel mio caso è 40) dalla curva sinusoidale.
Ma sto sbagliando qualcosa, perché il mio valore arriva fino a 79 invece del previsto 40. Cosa sto facendo di sbagliato?
Questo è il mio tentativo:
#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;
}
Risposte
Una risoluzione diretta consiste nel dividere l'ampiezza dell'onda per 2 @Eric Postpischil
// int value = height + sin(degToRad(i / 2 + 1)) * height;
int value = height + sin(degToRad(i / 2 + 1)) * height)/2;
e usa la matematica in virgola mobile nella i/2
divisione. @bruno
Mi aspetto un risultato più accettabile usando l'arrotondamento piuttosto che il troncamento (cosa fa il codice di OP) passando da virgola mobile a int
.
int value = height + lround(sin(degToRad(i / 2 + 1)) * height)/2);
L'ampiezza della curva sarebbe quindi height / 2
e non height
; semplicemente sostituire
int value = height + sin(degToRad(i / 2 + 1)) * height;
con
int value = height / 2 + sin(degToRad(i / 2 + 1)) * height / 2;
Un buon modo per ricordarlo è che sin x è sempre nell'intervallo [-1, 1].