在范围内振荡一个值
Oscillating a value within 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;
}
解决这个问题的通常方法是修改你的结果行:
float result = sin(elapsed / RANGE) * RANGE;
你也可以替代
float result = sin(elapsed / MODIFIER) * RANGE;
如果您需要独立控制 quickly/slowly 它的更新方式。
如果你希望变化率恒定,那么sin()函数是没有根据的。相反,写:
float result = std::abs(std::remainder(elapsed * FACTOR, RANGE*2));
其中 'FACTOR' 允许您加快或减慢上升和下降的速度。
这个公式
float result = sin(ellapsed) * RANGE;
产生恒定频率的输出,过零之间的时间是恒定的。
假设你需要一个 0 左右的恒定斜率,你可以使用:
float result = sin(ellapsed/RANGE) * 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;
}
解决这个问题的通常方法是修改你的结果行:
float result = sin(elapsed / RANGE) * RANGE;
你也可以替代
float result = sin(elapsed / MODIFIER) * RANGE;
如果您需要独立控制 quickly/slowly 它的更新方式。
如果你希望变化率恒定,那么sin()函数是没有根据的。相反,写:
float result = std::abs(std::remainder(elapsed * FACTOR, RANGE*2));
其中 'FACTOR' 允许您加快或减慢上升和下降的速度。
这个公式
float result = sin(ellapsed) * RANGE;
产生恒定频率的输出,过零之间的时间是恒定的。
假设你需要一个 0 左右的恒定斜率,你可以使用:
float result = sin(ellapsed/RANGE) * RANGE;