具有非对齐输入点的双线性插值

Phr*_*ogz 9 algorithm interpolation

我有一组非网格对齐的输入值与网格对齐的输出值相关联.给定一个新的输入值,我想找到输出:

                                  矩形中的四个点,每个轴上的输入变化,但输出表示矩形输入.

(这些是X,Y坐标,将不精确的非方形眼动跟踪输入设备校准到屏幕上的确切位置.)

这看起来像Bilinear Interpolation,但我的输入值不是网格对齐的.给定输入,我如何计算出合理的输出值?


:在这种情况下,我有输入和输出点集,实际需要的是执行逆双线性插值以找到四边形内输入点的U,V坐标,然后执行正常的双线性插值(如Nico在下面的答案)使用那些U,V坐标在输出四边形上.

Nic*_*ler 11

你可以在任何凸四边形中进行双线性插值.笛卡尔网格稍微简单一些,因为插值参数的计算是微不足道的.在一般情况下,您插入如下:

parameters alpha, beta
interpolated value = (1 - alpha) * ((1 - beta) * p1 + beta * p2) + alpha * ((1 - beta) * p3 + beta * p4)
Run Code Online (Sandbox Code Playgroud)

为了计算参数,您必须求解方程组.将输入值放在p1through的位置p4并求解alphabeta.

然后将输出值放在p1直通的位置,p4并使用计算出的参数计算最终插值输出值.

对于常规网格,参数计算归结为:

alpha = x / cell width
beta  = y / cell height
Run Code Online (Sandbox Code Playgroud)

它自动解决方程式.

下面是一个采样插值alpha=0.3beta=0.6

样本插值

实际上,方程可以通过分析求解.然而,公式非常难看.因此,迭代方法可能更好.方程组有两种解决方案.您需要选择两个参数都在[0,1]中的解决方案.

第一解决方案

alpha = -(b e - a f + d g - c h + sqrt(-4 (c e - a g) (d f - b h) +
        (b e - a f + d g - c h)^2))/(2 c e - 2 a g)    
beta  = (b e - a f - d g + c h + sqrt(-4 (c e - a g) (d f - b h) + 
        (b e - a f + d g - c h)^2))/(2 c f - 2 b g)
Run Code Online (Sandbox Code Playgroud)

哪里

a = -p1.x + p3.x
b = -p1.x + p2.x
c = p1.x - p2.x - p3.x + p4.x
d = center.x - p1.x
e = -p1.y + p3.y
f = -p1.y + p2.y
g = p1.y - p2.y - p3.y + p4.y
h = center.y - p1.y
Run Code Online (Sandbox Code Playgroud)

二解决方案:

alpha = (-b e + a f - d g + c h + sqrt(-4 (c e - a g) (d f - b h) + 
        (b e - a f + d g - c h)^2))/(2 c e - 2 a g)
beta  = -((-b e + a f + d g - c h + sqrt(-4 (c e - a g) (d f - b h) + 
        (b e - a f + d g - c h)^2))/( 2 c f - 2 b g))
Run Code Online (Sandbox Code Playgroud)

  • 这是一种通用插值方案.您可以插入任何内容 - 无论是单个值,向量还是整个张量.我不完全了解您的情况,所以我无法判断双线性插值是否适合您的需求,但您要求它.通常使用方程组计算参数.由于它不是线性的,迭代方法是你的朋友.实际上,这与你说的相反.您已经知道交叉点,需要找到导致此交叉点的参数. (2认同)