admin管理员组

文章数量:1405188

All,

I THINK that I'm looking for a function for Trilinear interpolation.

Here's the details:

I have a three dimensional dataset:

  • Dimension 1 varies from 0 to 100 in increments of 5
  • Dimension 2 varies from 0 to 100 in increments of 5
  • Dimension 3 varies from 0 to 1 in increments of 0.1

So, I have 4851 total values (21 x 21 x 11).

If I need to find the value for (10, 25, 0.3) - that's easy - I can just look it up in the 3-dimensional array.

But, I need to be able to e up with the best approximation, given dimensional values of (17,48,0.73), for example.

So, I think that what I'm looking for is a trilinear interpolation (although I'd definitely appreciate any suggestions for a better method, or a hint that I'm on the wrong topic altogether...)

A quick google search turns up this formula:

Vxyz = 
V000(1-x)(1-y)(1-z) +
V100x(1-y)(1-z) +
V010(1-x)y(1-z) +
V001(1-x)(1-y)z +
V101x(1-y)z +
V011(1-x)yz +
V110xy(1-z) +
V111xyz 

Which looks like what I'm looking for, but I'm not sure what x, y, and z represent. If I had to guess, x is a ratio - the distance of my "target" first dimension value from the nearest two values I have, y is the ratio for the second dimension, and z is the ratio for the third dimension.

Of course, since I don't really know what I'm talking about, I wouldn't know if this is right or wrong.

So, ideally, I'd like a bit of Javascript or pseudo-code that shows exactly how to acplish this.

Many thanks in advance!

All,

I THINK that I'm looking for a function for Trilinear interpolation.

Here's the details:

I have a three dimensional dataset:

  • Dimension 1 varies from 0 to 100 in increments of 5
  • Dimension 2 varies from 0 to 100 in increments of 5
  • Dimension 3 varies from 0 to 1 in increments of 0.1

So, I have 4851 total values (21 x 21 x 11).

If I need to find the value for (10, 25, 0.3) - that's easy - I can just look it up in the 3-dimensional array.

But, I need to be able to e up with the best approximation, given dimensional values of (17,48,0.73), for example.

So, I think that what I'm looking for is a trilinear interpolation (although I'd definitely appreciate any suggestions for a better method, or a hint that I'm on the wrong topic altogether...)

A quick google search turns up this formula:

Vxyz = 
V000(1-x)(1-y)(1-z) +
V100x(1-y)(1-z) +
V010(1-x)y(1-z) +
V001(1-x)(1-y)z +
V101x(1-y)z +
V011(1-x)yz +
V110xy(1-z) +
V111xyz 

Which looks like what I'm looking for, but I'm not sure what x, y, and z represent. If I had to guess, x is a ratio - the distance of my "target" first dimension value from the nearest two values I have, y is the ratio for the second dimension, and z is the ratio for the third dimension.

Of course, since I don't really know what I'm talking about, I wouldn't know if this is right or wrong.

So, ideally, I'd like a bit of Javascript or pseudo-code that shows exactly how to acplish this.

Many thanks in advance!

Share asked Oct 29, 2009 at 3:42 mattstuehlermattstuehler 9,33218 gold badges81 silver badges115 bronze badges 2
  • What are you using it for? Just curious :) – Matt Baker Commented Oct 29, 2009 at 6:27
  • 1 Matt - it's sort of a financial planning application. I've been given a table by my client's investment consulting group. The three dimensions are your age, your planned retirement age, and your portfolio's equity/bond ratio; the table presents the projected retirement ine your portfolio will produce. So, if you're 30, planning to retire at 65, and 85% of your portfolio is in equity, your portfolio will produce $x in retirement ine. Works great, except the intervals are large, and I need to be able to estimate the value for inputs between the intervals. – mattstuehler Commented Oct 29, 2009 at 14:51
Add a ment  | 

1 Answer 1

Reset to default 6

The code you are looking at is trying to do a weighted average of the 8 points of the cube with vertices that are in your dataset, and which encloses the point you are trying to find a value for.

For a point p

// Find the x, y and z values of the 
// 8 vertices of the cube that surrounds the point
x0 = Math.floor(p.x / 5);
x1 = Math.floor(p.x / 5) + 1;

y0 = Math.floor(p.y / 5);
y1 = Math.floor(p.y / 5) + 1;

z0 = Math.floor(p.z / .1);
z1 = Math.floor(p.z / .1) + 1;

// Look up the values of the 8 points surrounding the cube
p000 = dataset[x0][y0][z0];
p001 = dataset[x0][y0][z1];
// ...

// Find the weights for each dimension
x = (x - x0) / 5;
y = (y - y0) / 5;
z = (z - z0) / .1;

// Compute the guess using the method you found
// ...

本文标签: algorithmJavascript function for trilinear interpolationStack Overflow