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나눗셈 에서 부동 소수점 수학을 사용합니다 . @브루노


나는 잘림 (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] 범위에 있다는 것입니다.