Calcola la curva sinusoidale in C

Aug 16 2020

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

2 chux-ReinstateMonica Aug 16 2020 at 03:34

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

L'ampiezza della curva sarebbe quindi height / 2e 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].