如何在一定范围内振荡,但是时间间隔恒定?我想出了下一个算法,但是有一个问题就是增加Range会使得结果值也太快。
const int RANGE = 5; // Oscillate between -5 and 5
long start = 0;
float getStepTime()
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
long now = ts.tv_sec * 1000 + ts.tv_nsec / 1000000ULL;
if (start == 0) { start = now; }
float ellapsed = (now - start) / 1000.0f;
float result = sin(ellapsed) * RANGE;
printf("%f", result);
return result;
}
答案 0 :(得分:4)
这个公式
float result = sin(ellapsed) * RANGE;
产生恒定频率的输出,过零之间的时间是恒定的 假设你需要一个大约为0的常数斜率,你可以使用:
float result = sin(ellapsed/RANGE) * RANGE;
答案 1 :(得分:1)
解决此问题的常用方法是修改结果行:
float result = sin(elapsed / RANGE) * RANGE;
您也可以替换
float result = sin(elapsed / MODIFIER) * RANGE;
如果您需要独立控制更新速度/速度。
如果你想让变化率保持不变,那么sin()函数是没有根据的。相反,写一下:
float result = std::abs(std::remainder(elapsed * FACTOR, RANGE*2));
'FACTOR'允许你加快或减慢它上升和下降的速度。