Calcular la curva sinusoidal en C
Quiero obtener un valor periódico que se mueva entre 0 y una altura específica (en mi caso, 40) de la curva sinusoidal.
Pero estoy arruinando algo, porque mi valor llega hasta 79 en lugar del esperado 40. ¿Qué estoy haciendo mal?
Este es mi intento:
#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;
}
Respuestas
Una resolución directa es dividir la magnitud de la onda por 2 @Eric Postpischil
// int value = height + sin(degToRad(i / 2 + 1)) * height;
int value = height + sin(degToRad(i / 2 + 1)) * height)/2;
y use matemáticas de coma flotante en la i/2
división. @bruno
Espero un resultado más aceptable usando redondeo en lugar de truncamiento (lo que hace el código de OP) pasando de punto flotante a int
.
int value = height + lround(sin(degToRad(i / 2 + 1)) * height)/2);
La amplitud de la curva sería entonces height / 2
y no height
; simplemente reemplazar
int value = height + sin(degToRad(i / 2 + 1)) * height;
con
int value = height / 2 + sin(degToRad(i / 2 + 1)) * height / 2;
Una buena forma de recordarlo es que sen x siempre está en el rango [-1, 1].