如何在动画曲线上使用二进制搜索来查找时间给定值?
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)
我正在使用 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)