在范围内摆动一个值

时间:2015-08-25 15:50:10

标签: c++ time

如何在一定范围内振荡,但是时间间隔恒定?我想出了下一个算法,但是有一个问题就是增加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;
}

2 个答案:

答案 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'允许你加快或减慢它上升和下降的速度。