Рассчитать синусоидальную кривую в C
Я хочу получить периодическое значение, которое перемещается между 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 @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);
Амплитуда кривой тогда была бы 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].