Berechnen Sie die Sinuskurve in C.

Aug 16 2020

Ich möchte einen periodischen Wert aus der Sinuskurve erhalten, der sich zwischen 0 und einer bestimmten Höhe (in meinem Fall 40) bewegt.

Aber ich vermassle etwas, weil mein Wert bis auf 79 anstatt auf die erwarteten 40 steigt. Was mache ich falsch?

Das ist mein Versuch:

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

Antworten

2 chux-ReinstateMonica Aug 16 2020 at 03:34

Eine direkte Auflösung besteht darin, die Wellengröße durch 2 @Eric Postpischil zu teilen

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

und verwenden Sie Gleitkomma-Mathematik in der i/2Division. @ Bruno


Ich erwarte ein akzeptableres Ergebnis mit Rundung anstelle von Kürzung (was der OP-Code tut), die von Gleitkomma zu Gleitkomma geht int.

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

Die Amplitude der Kurve wäre dann height / 2und nicht height; einfach ersetzen

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

mit

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

Ein guter Weg, sich daran zu erinnern, ist, dass sin x immer im Bereich [-1, 1] liegt.