Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

2D Array Interpolation

i am currently working on a 3D game in c#. I have a 2 dimensional array called data where i get a z value for my x and y values. for example:

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

etc. my problem is that this is very vague and I also need the calculated (interpolated) values for example x=1.5 and y=2.5. How can I get to this value and are there any functions available?

Thank you

like image 995
hashtag7 Avatar asked Mar 03 '14 16:03

hashtag7


People also ask

What does interp2 do in Matlab?

Vq = interp2( V ) returns the interpolated values on a refined grid formed by dividing the interval between sample values once in each dimension.


2 Answers

Maybe Bilinear Interpolation can be used in your scenario:

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]);

Interpolating between 0, 4, 1 and 3 yields the following result:

Bilinear interpolation

If you have triangulated the height map, Barycentric Interpolation might be more appropriate:

//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];
}

Interpolating between 0, 4, 1 and 3 yields the following result:

Barycentric interpolation

like image 178
Nico Schertler Avatar answered Oct 18 '22 05:10

Nico Schertler


You have two known points:

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

And you want to calculate the value

C = (1.5, 2.5) = ???

Here's an idea that follows from your linear example. Calculate the linear for each axis. So start with X:

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

Then calculate the linear for the y-axis:

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

Then average Cx and Cy to get C(x,y)

C(1.5, 2.5) = (Cx + Cy) * 0.5 = 4.375
like image 1
Weyland Yutani Avatar answered Oct 18 '22 06:10

Weyland Yutani