逆双线性插值(任意四边形中的插值)

前面介绍了在二维矩形区域进行插值的双线性插值,如果要在一个任意四边形中进行插值,可以用逆双线性插值(Inverse Bilinear Interpolation)。

虽然叫逆双线性插值,其实思路和双线性插值是一样的:

首先由A点和B点的值插值得到P点的值:

f(P)=f(A)+(f(B)-f(A))\cdot u

然后由D点和C点的值插值得到Q点的值:

f(Q)=f(D)+(f(C)-f(D))\cdot u

最后由P点和Q点的值插值得到X点的值:

f(X)=f(P)+(f(Q)-f(P))\cdot v

因此有

f(X)=f(A)+(f(B)-f(A))\cdot u+(f(D)-f(A))\cdot v\\+(f(A)-f(B)+f(C)-f(D))\cdot u\cdot v

其中u和v为相应的插值系数,只要得到u和v,就可以得到f(X)。求两个未知数需要两个方程,X点的坐标(x,y)分别满足

x=x_{A}+(x_{B}-x_{A})\cdot u+(x_{D}-x_{A})\cdot v+(x_{A}-x_{B}+x_{C}-x_{D})\cdot u\cdot v         (1)

y=y_{A}+(y_{B}-y_{A})\cdot u+(y_{D}-y_{A})\cdot v+(y_{A}-y_{B}+y_{C}-y_{D})\cdot u\cdot v            (2)

方便起见,我们定义向量

H=X-A\\ E=B-A\\ F=D-A\\ G=A-B+C-D

则通过方程(1)得到

u=\frac{Hi-Fi\cdot v}{Ei+Gi\cdot v}

代入方程(2)得

Hj\cdot Ei + Hj\cdot Gi\cdot v = Ej\cdot Hi - Ej\cdot Fi\cdot v + Fj\cdot Ei\cdot v \\+ Fj\cdot Gi\cdot v^2 + Gj\cdot Hi\cdot v - Gj\cdot Fi\cdot v^2

这是一个一元二次方程,其各阶系数为:

k2=Gi\cdot Fj-Gj\cdot Fi\\ k1=Ei\cdot Fj-Ej\cdot Fi+Hi\cdot Gj-Hj\cdot Gi\\ k0=Hi\cdot Ej-Hj\cdot Ei

当X在四边形ABCD内部时,k1^2-4\cdot k0\cdot k2总是大于0的,于是可以解得

v=\frac{-k1\pm \sqrt{k1^2-4\cdot k0\cdot k2}}{2\cdot k2}

然后从两个解中选取在[0,1]区间内的v值,再根据v计算出u,最终求出f(X)。

注意当AB和CD平行时,G=0,从而k2=0,方程退化为线性方程

k0+k1\cdot v=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

 

  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值