Calcular la curva sinusoidal en C

Aug 16 2020

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

2 chux-ReinstateMonica Aug 16 2020 at 03:34

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/2divisió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);
2 Hi-IloveSO Aug 16 2020 at 03:26

La amplitud de la curva sería entonces height / 2y 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].