Calcular a curva seno em C
Quero obter um valor periódico que se move entre 0 e uma altura especificada (no meu caso, 40) a partir da curva seno.
Mas estou bagunçando algo, porque meu valor vai para 79 em vez dos 40 esperados. O que estou fazendo de errado?
Esta é minha tentativa:
#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;
}
Respostas
Uma resolução direta é dividir a magnitude da onda por 2 @Eric Postpischil
// int value = height + sin(degToRad(i / 2 + 1)) * height;
int value = height + sin(degToRad(i / 2 + 1)) * height)/2;
e use matemática de ponto flutuante na i/2
divisão. @bruno
Espero um resultado mais aceitável usando arredondamento em vez de truncamento (o que o código do OP faz) indo do ponto flutuante para int
.
int value = height + lround(sin(degToRad(i / 2 + 1)) * height)/2);
A amplitude da curva seria então height / 2
e não height
; simplesmente substitua
int value = height + sin(degToRad(i / 2 + 1)) * height;
com
int value = height / 2 + sin(degToRad(i / 2 + 1)) * height / 2;
Uma boa maneira de lembrar isso é que sin x está sempre no intervalo [-1, 1].