以下是我目前的情况:
我有一个2维均匀的点网格,每个点都有一个相关的浮点值
7---2
| . |
2---1
我可以使用双线性插值在这些点之间插值:
public float GetValue(float x, float y, float topLeft, float topRight,
float bottomLeft, float bottomRight)
{
return topLeft*(1-x)*(1-y) + topRight*x*(1-y) +
bottomLeft*(1-x)*y + bottomRight*x*y;
}
现在我需要为每个点添加一个权重,以确定其对周围区域的影响程度
例如:如果所有4个点具有相同的权重值,则这些权重相互抵消,插值将返回与未加权版本完全相同的值。
现在让我们说所有点的权重都是1,除了左下角的重量值为2的点。在这种情况下,它的值会影响插值的两倍,其他值的插值将有利于值位于左下角。
基本上我正在尝试实现这样的方法:
public float GetValue(float x, float y, float topLeftValue, topLeftWeight,
float topRightValue, float topRightWeight,
float bottomLeftValue, float bottomLeftWeight,
float bottomRightValue, float bottomRightWeight)
{
return ?
}
我有什么想法可以做到这一点?是否有方程/算法或双线性插值方法的修改考虑加权角点值?
感谢您的帮助!
答案 0 :(得分:0)
为了使事情更容易,假设x = y = 0.5
如果所有4个点具有相同的权重值,则返回值应为
return topLeftValue/4 + topRightValue/4 + bottomLeftValue/4 + bottomRightValue/4;
现在,让所有点的权重都为1,除了左下角的重量值为2的点,返回值应为
return topLeftValue/5 + topRightValue/5 + bottomLeftValue*2/5 + bottomRightValue/5;
通过乘以
调整bottomLeftValue的权重 4*bottomLeftWeight / (topLeftWeight+topRightWeight+bottomLeftValue+bottomRightWeight)
现在,回到一般情况。 使用上述方法调整每个值的权重。 它会变成
float overallWeight = topLeftWeight + topRightWeight + bottomLeftValue + bottomRightWeight;
return topLeftValue*(1-x)*(1-y)*(4*topLeftWeight/overallWeight)
+ topRightValue*x*(1-y)*(4*topRightWeight/overallWeight)
+ bottomLeftValue*(1-x)*y*(4*bottomLeftWeight/overallWeight)
+ bottomRightValue*x*y*(4*bottomRightWeight/overallWeight)