Oblicz krzywą sinusoidalną w C

Aug 16 2020

Chcę uzyskać okresową wartość, która porusza się od 0 do określonej wysokości (w moim przypadku jest to 40) od krzywej sinusoidalnej.

Ale coś psuję, ponieważ moja wartość idzie aż do 79 zamiast oczekiwanych 40. Co robię źle?

To jest moja próba:

#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;
    }

Odpowiedzi

2 chux-ReinstateMonica Aug 16 2020 at 03:34

Bezpośrednią rozdzielczością jest podzielenie wielkości fali przez 2 @ Eric Postpischil

// int value = height + sin(degToRad(i / 2 + 1)) * height; 
int value = height + sin(degToRad(i / 2 + 1)) * height)/2;

i używaj matematyki zmiennoprzecinkowej w i/2dzieleniu. @bruno


Oczekuję bardziej akceptowalnego wyniku przy użyciu zaokrąglania zamiast obcinania (co robi kod OP) przechodząc od zmiennoprzecinkowego do int.

int value = height + lround(sin(degToRad(i / 2 + 1)) * height)/2);
2 Hi-IloveSO Aug 16 2020 at 03:26

Amplituda krzywej byłaby wtedy, height / 2a nie height; po prostu wymień

int value = height + sin(degToRad(i / 2 + 1)) * height;

z

int value = height / 2 + sin(degToRad(i / 2 + 1)) * height / 2;

Dobrym sposobem na zapamiętanie, że sin x jest zawsze w przedziale [-1, 1].