我有一条路径,它在时间“t”处求值,并根据路径类型返回方向和位置。
时间值受路径类型的影响:

switch (type)
{
    case PathType.Closed:
        time = ToolBox.Wrap(time, StartTime, EndTime);
        break; // Wrap time around the path time to loop

    case PathType.Open:
        time = ToolBox.Min(time, EndTime);
        break; // Clamp the time value to the max path time range

    case PathType.Oscillating:
        break;
}

丢失的链接正在振荡。
我的问题是,什么是在两个值之间振荡的好的、有效的方法?
例如(2,7)如果时间达到7,它会向2反转并递减,一旦达到2,它会向7反转并递增。
算法应该知道是否在原始值的基础上增加/减少该值,因此如果该值是9,它知道答案是7-(abs(7-9))。如果该值为14,则该值已被包围,因此将导致增加1。
更高的值还将增加或减少该值,具体取决于它环绕原始范围的次数。
我希望这是有道理的,因为我觉得很难解释。
编辑:
不使用浮点值振荡:
        for (float i = 0; i < 100; i += 0.1f)
        {
            Console.WriteLine("{0} {1}", i, Oscillate(2.5f, 7.5f, i));
        }

    private float Oscillate(float min, float max, float value)
    {
        float range = max - min;

        float multiple = value / range;

        bool ascending = multiple % 2 == 0;
        float modulus = value % range;

        return ascending ? modulus + min : max - modulus;
    }

最佳答案

理想情况下,您应该将此功能抽象到某种类中,而不必关心使用它时实现的实际工作方式。这里是一个关于C++中的什么(我的C是有点生锈)的初步例子。我想你可以轻而易举地把它做成C。

class oscillator
{
  private:
    float min;
    float max;

    static float mod(float num, float div)
    {
        float ratio = num / div;
        return div * (ratio - std::floor(ratio));
    }

  public:
    oscillator(float a, float b)
      : min(a < b ? a : b), max(a > b ? a : b) {}

    float range() ( return max-min; }

    float cycle_length() { return 2*range(); }

    float normalize(float val)
    {
        float state = mod(val-min, cycle_length());

        if (state > range())
            state = cycle_length()-state;

        return state + min;
    }
};

关于c# - 在两个值之间振荡还是“乒乓”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11543685/

10-12 05:51