Tính đường cong sin trong C

Aug 16 2020

Tôi muốn nhận một giá trị tuần hoàn di chuyển giữa 0 và độ cao được chỉ định (trong trường hợp của tôi là 40) từ đường cong hình sin.

Nhưng tôi đang làm điều gì đó rối tung lên, bởi vì giá trị của tôi giảm xuống tận 79 thay vì 40 như mong đợi. Tôi đang làm gì sai?

Đây là nỗ lực của tôi:

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

Trả lời

2 chux-ReinstateMonica Aug 16 2020 at 03:34

Một giải pháp trực tiếp là chia cường độ sóng cho 2 @Eric Postpischil

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

và sử dụng toán học dấu phẩy động trong phép i/2chia. @bruno


Tôi mong đợi một kết quả dễ chấp nhận hơn bằng cách sử dụng làm tròn thay vì cắt ngắn (mã của OP) đi từ dấu phẩy động sang int.

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

Biên độ của đường cong khi đó sẽ là height / 2và không height; chỉ cần thay thế

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

với

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

Một cách hay để nhớ rằng sin x luôn nằm trong khoảng [-1, 1].