У меня вопрос по билинейной интерполяции в проекте 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, 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 станет вашим другом.
Других решений пока нет …