看看样条插值区间查找函数写的多细腻
优秀的程序猿不仅要有深厚理论基础,更要有缜密的思维, 一个简单的函数, 有非常多人都写不好,为什么,
不是做不到,不是想不到, 往往是因为懒而不愿意深入思考. 有句话叫, 天下大事, 必做于细.
int Spline::findTimeInterval(Number time, int startIndex)
{int length = this->_times.size();
if (time < this->_times[0] || time > this->_times[length - 1])
{
throw DeveloperError("time is out of range.");
}
if (startIndex < 0 || startIndex > length-1)
{
throw DeveloperError("length is out of range.");
}
// Take advantage of temporal coherence by checking current, next and previous intervals
// for containment of time.
if (time >= this->_times[startIndex])
{
if (startIndex + 1 < length && time < this->_times[startIndex + 1])
{
return startIndex;
}
else if (startIndex + 2 < length && time < this->_times[startIndex + 2])
{
return startIndex + 1;
}
}
else if (startIndex - 1 >= 0 && time >= this->_times[startIndex - 1])
{
return startIndex - 1;
}
// The above failed so do a linear search. For the use cases so far, the
// length of the list is less than 10. In the future, if there is a bottle neck,
// it might be here.
int i;
if (time > this->_times[startIndex])
{
for (i = startIndex; i < length - 1; ++i) {
if (time >= this->_times[i] && time < this->_times[i + 1]) {
break;
}
}
} else {
for (i = startIndex - 1; i >= 0; --i) {
if (time >= this->_times[i] && time < this->_times[i + 1]) {
break;
}
}
}
if (i == length - 1) {
i = length - 2;
}
return i;
}