Это упрощение, но оно должно помочь вам начать.С одной стороны, так как стандарт передискретизации однородна, не существует на самом деле понятие поворотной точки.Во всяком случае, они обычно начинаются с угла, так как таким образом проще запускать циклы for.
Обычно алгоритм выглядит примерно так: псевдокод
function resample (srcImg, dstSize) {
dstImg = makeImage(dstSize)
for (r = 0; r < dstSize.height; ++r) {
for (c = 0; r < dstSize.width; ++c) {
// getResampleLoc returns float coordinate
resampleLoc = getResampleLoc(c, r, dstImg.size, srcImg.size)
color = getColor(srcImg, resampleLoc)
dstImg.setColor(c, r, color)
}
}
return dstImage
}
Для равномерной повторной выборкиgetResampleLoc - это просто простой масштаб x и y от размера dstImg до размера srcImg.Возвращает координаты с плавающей точкой, которые передаются в getColor.Реализация getColor - это то, что определяет различные алгоритмы передискретизации.В основном это смешивает пиксели, окружающие координату в некотором отношении.В действительности, существуют оптимизации, которые позволяют сделать информацию, генерируемую внутри getColor, общей для вызовов, но не беспокойтесь об этом.
Для вас вам понадобится что-то вроде:
function resample (srcImg, dstSize, pivotPt) {
dstImg = makeImage(dstSize)
for (r = 0; r < dstSize.height; ++r) {
for (c = 0; r < dstSize.width; ++c) {
// getResampleLoc returns float coordinate
resampleLoc = getResampleLoc(c, r, dstImg.size, srcImg.size, pivotPt)
color = getColor(srcImg, resampleLoc)
dstImg.setColor(c, r, color)
}
}
return dstImage
}
И тогда вам просто нужно реализовать getResampleLoc, чтобы принять во внимание pivotPt.Вероятно, самое простое - записать расстояние до края.