-
-// locate by bisection, O(log2(n))
-// iLastFloor is used when sequential calls to interpolate have monotonically increasing dX
-double
-ParallelRaysums::interpolate (double* pdX, double* pdY, int n, double dX, int* iLastFloor)
-{
- int iLower = -1;
- int iUpper = n;
- if (iLastFloor && *iLastFloor >= 0 && pdX[*iLastFloor] < dX)
- iLower = *iLastFloor;
-
- while (iUpper - iLower > 1) {
- int iMiddle = (iUpper + iLower) >> 1;
- if (dX >= pdX[iMiddle])
- iLower = iMiddle;
- else
- iUpper = iMiddle;
- }
- if (dX <= pdX[0])
- return pdY[0];
- else if (dX >= pdX[n-1])
- return pdY[1];
-
- if (iLower < 0 || iLower >= n) {
- sys_error (ERR_SEVERE, "Coordinate out of range [locateThetaBase]");
- return 0;
- }
-
- if (iLastFloor)
- *iLastFloor = iLower;
- return pdY[iLower] + (pdY[iUpper] - pdY[iLower]) * ((dX - pdX[iLower]) / (pdX[iUpper] - pdX[iLower]));
-}
-