二维阵列插值

时间:2014-03-03 16:28:26

标签: c# interpolation multidimensional-array

我目前正在使用c#进行3D游戏。我有一个名为data的二维数组,其中我的zx值得y。 例如:

data[x,y] = z;
data[1,2] = 4;
data[2,4] = 5;

等。 我的问题是这是非常模糊的,我还需要计算(插值)值,例如x = 1.5和y = 2.5。如何获得此值并且是否有可用的功能?

谢谢

2 个答案:

答案 0 :(得分:10)

也许 Bilinear Interpolation 可以在您的场景中使用:

float fractionX = ... //the fraction part of the x coordinate
float integerX = ... //the integer part of the x coordinate
float fractionY, integerY = ...
interpolatedValue = (1 - fractionX) * 
                        ((1 - fractionY) * data[integerX, integerY] + 
                         fractionY * data[integerX, integerY + 1]) + 
                    fractionX * 
                        ((1 - fractionY) * data[integerX + 1, integerY] + 
                        fractionY * data[integerX + 1, integerY + 1]);

在0,4,1和3之间插值会产生以下结果:

Bilinear interpolation

如果你对高度图进行了三角测量,重心插值可能更合适:

//Assuming the following triangle alignment:
//  1 +--+--+--+
//    | /| /| /|
//    |/ |/ |/ |
//  0 +--+--+--+

if (fractionX < fractionY) //the upper triangle
{
    interpolatedValue = (1 - fractionY) * data[integerX, integerY] +
                        fractionX * data[integerX + 1, integerY + 1] +
                        (fractionY - fractionX) * data[integerX, integerY + 1];
}
else //the lower triangle
{
    interpolatedValue = (1 - fractionX) * data[integerX, integerY] +
                        fractionY * data[integerX + 1, integerY + 1] +
                        (fractionX - fractionY) * data[integerX + 1, integerY];
}

在0,4,1和3之间插值会产生以下结果:

Barycentric interpolation

答案 1 :(得分:1)

您有两个已知点:

A = (1,2) = 4
B = (2,4) = 5

您想要计算值

C = (1.5, 2.5) = ???

以下是您的线性示例的概念。计算每个轴的线性。所以从X开始:

Ax = (1) = 4
Bx = (2) = 5
so you calculate Cx as:
Cx = (1.5) = 4.5

然后计算y轴的线性:

Ay = (2) = 4
By = (4) = 5
and calculate Cy as:
Cy = (2.5) = 4.25

然后将Cx和Cy平均得到C(x,y)

C(1.5, 2.5) = (Cx + Cy) * 0.5 = 4.375