Berechnen Sie die Sinuskurve in C.
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
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/2
Division. @ 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);
Die Amplitude der Kurve wäre dann height / 2
und 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.