Calcular a curva seno em C

Aug 16 2020

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

2 chux-ReinstateMonica Aug 16 2020 at 03:34

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/2divisã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);
2 Hi-IloveSO Aug 16 2020 at 03:26

A amplitude da curva seria então height / 2e 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].