如何在动画曲线上使用二进制搜索来查找时间给定值?

How to use binary search on an animation curve to find time given value?

我正在使用 Unity 的动画曲线,不幸的是它只有一个 Evaluate 函数,给定时间给出值。我想创建一个与之相反的方法。价值给予时间。我看了这个 post: Unity get time by value 但所有答案都指的是反转曲线,我认为,大多数评论都同意,这是麻烦且容易出错的。我认为更好的解决方案是使用二进制搜索。但是,我现在的实现有时会找不到时间。

对于上下文,曲线表示汽车加速时的速度。它总是单调递增的。到目前为止,这就是我所得到的:

 float GetTimeOnCurve(AnimationCurve c, float speed)
    {
        if (speed < c.keys[0].value)
        {
            return c.keys[0].time;
        }else if (speed > c.keys.Last().value)
        {
            return c.keys.Last().time;
        }

        float min = c.keys[0].time;
        float max = c.keys.Last().time;
        const float elipson = 0.001f;
        while (min <= max)
        {
            float mid = (min + max) / 2;
            if (speed >= c.Evaluate(mid) - elipson && speed <= c.Evaluate(mid) + elipson)
            {
                return mid;
            }else if (speed < c.Evaluate(mid))
            {
                max = mid - elipson;
            }
            else
            {
                min = mid + elipson;
            }
        }
        Debug.LogError("Speed not found");
        return TopSpeed;
    }

我该怎么做才能始终找到时间?

它可能会在陡峭的曲线上失败,你应该将条件更改为

speed >= c.Evaluate(mid - elipson) && speed <= c.Evaluate(mid + elipson)