Функция Javascript для трилинейной интерполяции - PullRequest
6 голосов
/ 29 октября 2009

All

Я ДУМАЮ , что я ищу функцию для трилинейной интерполяции.

Вот подробности:

У меня есть трехмерный набор данных:

  • Размер 1 варьируется от 0 до 100 с шагом 5
  • Размер 2 варьируется от 0 до 100 с шагом 5
  • Размер 3 варьируется от 0 до 1 с шагом 0,1

Итак, у меня 4851 общее значение (21 х 21 х 11).

Если мне нужно найти значение для (10, 25, 0.3) - это легко - я могу просто посмотреть его в 3-мерном массиве.

Но мне нужно иметь возможность придумать наилучшее приближение , учитывая размерные значения (17,48,0.73), например.

Итак, я думаю , что то, что я ищу, - это трилинейная интерполяция (хотя я определенно буду признателен за любые предложения по лучшему методу или намек, что я вообще не на ту тему ...)

Быстрый поиск в Google приводит к следующей формуле:

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 

Что похоже на то, что я ищу, но я не уверен, что представляют x, y и z. Если бы мне пришлось угадывать, x - это отношение - расстояние от моего «целевого» значения первого измерения до ближайших двух значений, которые у меня есть, y - это отношение для второго измерения, а z - это отношение для третьего измерения.

Конечно, поскольку я не знаю, о чем говорю, я не знаю, правильно это или неправильно.

Итак, в идеале, я бы хотел немного Javascript или псевдокода, который показывает, как именно это сделать.

Заранее большое спасибо!

1 Ответ

6 голосов
/ 29 октября 2009

Код, который вы просматриваете, пытается получить средневзвешенное значение для 8 точек куба с вершинами, которые находятся в вашем наборе данных, и который охватывает точку, для которой вы пытаетесь найти значение.* За точку 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
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...