Oblicz krzywą sinusoidalną w C
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
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/2
dzieleniu. @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);
Amplituda krzywej byłaby wtedy, height / 2
a 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].