Tính đường cong sin trong C
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
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/2
chia. @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);
Biên độ của đường cong khi đó sẽ là height / 2
và 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].