Cで正弦曲線を計算する

Aug 16 2020

正弦曲線から0と指定された高さ(私の場合は40)の間を移動する周期値を取得したいと思います。

しかし、私の価値は予想される40ではなく79にまで達するため、何かを台無しにしています。何が間違っているのでしょうか。

これは私の試みです:

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

回答

2 chux-ReinstateMonica Aug 16 2020 at 03:34

直接的な解決策は、波の大きさを2で割ることです@Eric Postpischil

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

i/2除算で浮動小数点演算を使用します。@bruno


浮動小数点からに移行する切り捨て(OPのコードが行うこと)ではなく、丸めを使用すると、より許容できる結果が得られると思いintます。

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

その場合、曲線の振幅はであり、そうではheight / 2ありませんheight。単に交換する

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

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

これを覚えておくとよい方法は、sin xは常に[-1、1]の範囲にあるということです。