Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linear interpolation code on wikipedia - I don't understand it

I'm reading the following code (taken from here)

void linear_interpolation_CPU(float2* result, float2* data, 
                              float* x_out, int M, int N) {     
    float a;
    for(int j = 0; j < N; j++) {
        int k = floorf(x_out[j]);
        a = x_out[j] - floorf(x_out[j]);
        result[j].x = a*data[k+1].x + (-data[k].x*a + data[k].x);
        result[j].y = a*data[k+1].y + (-data[k].y*a + data[k].y);
    }   
}

but I don't get it.

Why isn't the result[y] calculated by using the

enter image description here

formula?

like image 309
Johnny Pauling Avatar asked Mar 11 '13 18:03

Johnny Pauling


People also ask

How do you explain linear interpolation?

Linear interpolation is a form of interpolation, which involves the generation of new values based on an existing set of values. Linear interpolation is achieved by geometrically rendering a straight line between two adjacent points on a graph or plane.

What is the linear interpolation code?

Linear Interpolation is the technique of determining the values of the functions of any intermediate points when the values of two adjacent points are known. Linear interpolation is basically the estimation of an unknown value that falls within two known values.

How do you use linear interpolation example?

1: Find the value of y at x = 4 given some set of values (2, 4), (6, 7). Based on this chart, calculate the estimated height of the plant on the fourth day. Solution: This is an example of linear growth and hence the linear interpolation formula is very much suitable here.


1 Answers

It is calculated that way.

Look at the first two lines:

int k = floorf(x_out[j]);
a = x_out[j] - floorf(x_out[j]);

The first line defines x0 using the floor function. This is because the article assumes a lattice spacing of one for the sample points, as per the line:

the samples are obtained on the 0,1,...,M lattice

Now we could rewrite the second line for clarity as:

a = x_out[j] - k;

The second line is therefore x-x0.

Now, let us examine the equation:

result[j].y = a*data[k+1].y + (-data[k].y*a + data[k].y);

Rewriting this in terms of y, x, and x0 gives:

y = (x-x0)*data[k+1].y + (-data[k].y*(x-x0) + data[k].y);

Let's rename data[k+1].y as y1 and data[k].y as y0:

y = (x-x0)*y1 + (-y0*(x-x0) + y0);

Let's rearrange this by pulling out x-x0:

y = (x-x0)*(y1-y0) + y0;

And rearrange again:

y = y0 + (y1-y0)*(x-x0);

Again, the lattice spacing is important:

the samples are obtained on the 0,1,...,M lattice

Thus, x1-x0 is always 1. If we put it back in, we get

y = y0 + (y1-y0)*(x-x0)/(x1-x0);

Which is just the equation you were looking for.

Granted, it's ridiculous that the code is not written so as to make that apparent.

like image 183
Richard Avatar answered Sep 19 '22 10:09

Richard