Рассчитать синусоидальную кривую в C

Aug 16 2020

Я хочу получить периодическое значение, которое перемещается между 0 и указанной высотой (в моем случае это 40) по синусоиде.

Но я что-то напортачил, потому что мое значение достигает 79 вместо ожидаемых 40. Что я делаю не так?

Это моя попытка:

#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].