Билинейная интерполяция — OSRM Rastersource

У меня вопрос по билинейной интерполяции в проекте OSRM.
Я понимаю «нормальную» билинейную интерполяцию. Вот картинка из Википедии, что такое безумие:

Билинейная интерполяция - Википедия

Теперь я пытаюсь понять билинейную интерполяцию, которая используется в OSRM-Project для растровых исходных данных.

// Query raster source using bilinear interpolation
RasterDatum RasterSource::GetRasterInterpolate(const int lon, const int lat) const
{
if (lon < xmin || lon > xmax || lat < ymin || lat > ymax)
{
return {};
}

const auto xthP = (lon - xmin) / xstep;
const auto ythP =
(ymax - lat) /
ystep; // the raster texture uses a different coordinate system with y pointing downwards

const std::size_t top = static_cast<std::size_t>(fmax(floor(ythP), 0));
const std::size_t bottom = static_cast<std::size_t>(fmin(ceil(ythP), height - 1));
const std::size_t left = static_cast<std::size_t>(fmax(floor(xthP), 0));
const std::size_t right = static_cast<std::size_t>(fmin(ceil(xthP), width - 1));

// Calculate distances from corners for bilinear interpolation
const float fromLeft = xthP - left; // this is the fraction part of xthP
const float fromTop = ythP - top;   // this is the fraction part of ythP
const float fromRight = 1 - fromLeft;
const float fromBottom = 1 - fromTop;

return {static_cast<std::int32_t>(raster_data(left, top) * (fromRight * fromBottom) +
raster_data(right, top) * (fromLeft * fromBottom) +
raster_data(left, bottom) * (fromRight * fromTop) +
raster_data(right, bottom) * (fromLeft * fromTop))};
}

Оригинальный код здесь

Может кто-нибудь объяснить мне, как работает код?

Формат ввода SRTM данные в формате ASCII.

Переменные рост а также ширина определяются как Nrows а также NCOLUMNS.
Переменные xstep а также ystep определяются как:

return (max - min) / (static_cast<float>(count) - 1)

куда подсчитывать является рост за ystep а также ширина за xstep, Максимум а также мин аналогичный.

И еще один вопрос:
Могу ли я использовать тот же код для данных в TIF-формат и весь мир?

0

Решение

Горизонтальные пиксельные координаты находятся в диапазоне [0, width - 1]; аналогично вертикальные координаты находятся в [0, height - 1], (Соглашение о нулевой индексации используется во многих языках, включая C ++)

Линии

const auto xthP = (lon - xmin) / xstep; (и для ythP)

Преобразовать ввод образ-пространство координаты (long, lat) в координаты пикселей. xstep ширина каждого пикселя в образ-пространство.

Округляя это вниз (используя floor) дает пиксели, пересекаемые областью выборки с одной стороны, и округляются (ceil) дает пикселей на другой стороне. Для X-координаты они дают left а также right,

Причина использования fmin а также fmax должны зажим координаты, чтобы они не превышали координатный диапазон пикселей.


РЕДАКТИРОВАТЬ: так как вы пытаетесь интерпретировать эту картину, я перечислю соответствующие части ниже:

  • Q11 знак равно (left, top)
  • Q12(left, bottom), так далее.
  • P знак равно (xthP, ythP)
  • R1 знак равно fromTop, R2 знак равно fromBottom и т.п.

Хорошей отправной точкой будет http://www.cs.uu.nl/docs/vakken/gr/2011/Slides/06-texturing.pdf, слайд 27. Впрочем, в будущем Google станет вашим другом.

2

Другие решения

Других решений пока нет …