std::vector<float> spacing = ...;
float point = ...;
float result;
Поскольку вы говорите, что интервал не является (линейным), я бы кешировал суммы:
std::vector<float> sums(1, 0.0);
float sum=0;
for(int i=0; i<spacing.size(); ++i)
sums.push_back(sum+=spacing[i]);
//This only needs doing once.
//sums needs to be in increasing order.
Затем выполните двоичный поиск, чтобы найти точку слева:
std::vector<float>::iterator iter;
iter = std::lower_bound(sums.begin(), sums.end(), point);
Затем найдите результат оттуда:
if (iter+1 == sums.end())
return point-*iter;
else {
float midpoint = (*iter + *(iter+1))/2;
if (point < midpoint)
result = point - *iter;
else
result = *(iter+1) - point;
}
[РЕДАКТИРОВАТЬ] Не чувствую себя глупо.Вы сказали, что расстояние не было постоянным.Я интерпретировал это как нелинейный.Но тогда ваш пример кода является линейным, но не константой времени компиляции.Виноват.Я оставлю этот ответ в качестве более общего решения, хотя ваш (линейный) вопрос решается гораздо быстрее.