Объяснение сдвига пикселей фрагмента кода
Я портировал на новый C++ api код из этого ответа. Однако, хотя я понимаю большую часть кода, я не могу понять идею функции calc_shift() и того, как извлекается сдвиг пикселей. Если бы кто-то мог дать мне объяснение, я был бы очень благодарен. Функция имеет следующее:
float calc_shift(float x1,float x2,float cx,float k)
{
float thresh = 1;
float x3 = x1+(x2-x1)*0.5;
float res1 = x1+((x1-cx)*k*((x1-cx)*(x1-cx)));
float res3 = x3+((x3-cx)*k*((x3-cx)*(x3-cx)));
std::cerr<<"x1: "<<x1<<" - "<<res1<<" x3: "<<x3<<" - "<<res3<<std::endl;
if(res1>-thresh and res1 < thresh)
return x1;
if(res3<0){
return calc_shift(x3,x2,cx,k);
}else{
return calc_shift(x1,x3,cx,k);
}
}
и способ вызова вышеуказанной функции можно увидеть ниже:
int w = src.cols;
int h = src.rows;
xShift = calc_shift(0, Cx - 1, Cx, k);
float newCenterX = w - Cx;
float xShift2 = calc_shift(0, newCenterX - 1, newCenterX, k);
yShift = calc_shift(0, Cy - 1, Cy, k);
float newCenterY = w - Cy;
float yShift2 = calc_shift(0, newCenterY - 1, newCenterY, k);
xScale = (w - xShift - xShift2) / w;
yScale = (h - yShift - yShift2) / h;
Я хотел бы понять приведенный выше код, потому что я хочу также использовать его для случая искажения с подушечкой, где k<0. Если я использую его в том виде, как сейчас, код попадает в бесконечный цикл с заданным значением k<0.