Трилінійна інтерполяція

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Трилінійна інтерполяція — узагальнення лінійної інтерполяції на тривимірний простір з регулярною сіткою.

Алгоритм[ред.ред. код]

В тривимірному просторі з регулярною кубічною граткою з кроком 1, задано точку (x,y,z).

Обчислимо вагові коефіцієнти пропорційно відстані до сусідньої точки по кожній з осей:

x_d = x - \lfloor x \rfloor
y_d = y - \lfloor y \rfloor
z_d = z - \lfloor z \rfloor
Вісім точок кубічної гратки оточують точку С.
Трилінійна інтерполяція.

Спочатко обчислимо 4 лінійні інтерполяції вздовж осі z (на малюнку направлена вправо):

f_{\lfloor x \rfloor,\lfloor y \rfloor} = (1 - z_d)\cdot f(\lfloor x \rfloor,\lfloor y \rfloor, \lfloor z \rfloor) \; + \; z_d\cdot f(\lfloor x \rfloor, \lfloor y \rfloor, \lceil z \rceil)
f_{\lfloor x \rfloor,\lceil y \rceil} = (1 - z_d)\cdot f(\lfloor x \rfloor,\lceil y \rceil, \lfloor z \rfloor) \; + \; z_d\cdot f(\lfloor x \rfloor, \lceil y \rceil, \lceil z \rceil)
f_{\lceil x \rceil,\lfloor y \rfloor} = (1 - z_d)\cdot f(\lceil x \rceil,\lfloor y \rfloor, \lfloor z \rfloor) \; + \; z_d\cdot f(\lceil x \rceil, \lfloor y \rfloor, \lceil z \rceil)
f_{\lceil x \rceil,\lceil y \rceil} = (1 - z_d)\cdot f(\lceil x \rceil,\lceil y \rceil, \lfloor z \rfloor) \; + \; z_d\cdot f(\lceil x \rceil, \lceil y \rceil, \lceil z \rceil)

Потім обчислимо 2 лінійні інтерполяції вздовж осі y (на малюнку направлена від глядача):

 f_{\lfloor x \rfloor} = (1 - y_d)\cdot f_{\lfloor x \rfloor,\lfloor y \rfloor} + y_d\cdot f_{\lfloor x \rfloor,\lceil y \rceil}
 f_{\lceil x \rceil} = (1 - y_d)\cdot f_{\lceil x \rceil,\lfloor y \rfloor} + y_d\cdot f_{\lceil x \rceil,\lceil y \rceil}

Вкінці лінійно проінтерполюємо вздовж осі x (на малюнку направлена вгору):

 f(c) = (1 - x_d)\cdot f_{\lfloor x \rfloor} + x_d\cdot f_{\lceil x \rceil}.

Результат трилінійної інтерполяції не залежить від порядку вибору осей.

f(c) = INT(f(c_0), f(c_1)) \quad \gets \quad
\begin{cases} f(c_0) = INT(f(c_{00}), f(c_{10})) \\ f(c_1) = INT(f(c_{01}), f(c_{11})) \end{cases} \quad \gets \quad
\begin{cases}
f(c_{00}) = INT(f(c_{000}), f(c_{100})) \\
f(c_{10}) = INT(f(c_{010}), f(c_{110})) \\
f(c_{01}) = INT(f(c_{001}), f(c_{101})) \\
f(c_{11}) = INT(f(c_{011}), f(c_{111})) \\
\end{cases}

Дивись також[ред.ред. код]