在范围内振荡一个值

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;