前面介绍了在二维矩形区域进行插值的双线性插值,如果要在一个任意四边形中进行插值,可以用逆双线性插值(Inverse Bilinear Interpolation)。
虽然叫逆双线性插值,其实思路和双线性插值是一样的:
首先由A点和B点的值插值得到P点的值:
然后由D点和C点的值插值得到Q点的值:
最后由P点和Q点的值插值得到X点的值:
因此有
其中u和v为相应的插值系数,只要得到u和v,就可以得到f(X)。求两个未知数需要两个方程,X点的坐标(x,y)分别满足
(1)
(2)
方便起见,我们定义向量
则通过方程(1)得到
代入方程(2)得
这是一个一元二次方程,其各阶系数为:
当X在四边形ABCD内部时,总是大于0的,于是可以解得
然后从两个解中选取在[0,1]区间内的v值,再根据v计算出u,最终求出f(X)。
注意当AB和CD平行时,G=0,从而k2=0,方程退化为线性方程
从而v=-k0/k1。
参考文章中有代码可以借鉴。
参考文章:
inverse bilinear interpolation
http://www.iquilezles.org/www/articles/ibilinear/ibilinear.htm
Quadrilateral Interpolation, Part 2
http://reedbeta.com/blog/quadrilateral-interpolation-part-2/#inversion
纹理四边形插值2--逆双线性插值(InvBilinear Interpolation)
https://gameinstitute.qq.com/community/detail/121581