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

Поэтому я пытаюсь написать функцию трилинейной интерполяции, но у меня возникли проблемы с ее созданием.

Итак, сначала у нас есть 1D-интерполяция:

float interpolate1D(float v1, float v2, float x){
    return v1*(1-x) + v2*x;
}

А затем 2D-интерполяция:

float interpolate2D(float v1, float v2, float v3, float v4, float x, float y){

    float s = interpolate1D(v1, v2, x);
    float t = interpolate1D(v3, v4, x);
    return interpolate1D(s, t, y);
}

Но потом все становится сложнее, когда дело доходит до 3D. Я не могу понять, как реализовать 3D-интерполятор, используя функцию 2D-интерполяции. Я не знаю, почему у меня этот ментальный бок, потому что он должен быть простым расширением, но я думаю, что все переменные в игре сбивают меня с толку. Итак, я начал с функции ниже, но она не завершена, и мне нужна помощь, чтобы закончить ее.

float interpolate3D(v1, v2, v3, v4, v5, v6, v7, v8, float x, float y, float z){


     float s = interpolate2D(v1, v2, v3, v4, x, y);
     float t = interpolate2D(v5, v6, v7, v7, x, z);

     //What do I do next?
}

3 ответа

У вас 2 проблемы с вашим кодом - v7 появляется дважды.

Позвольте мне изложить это для вас:

float interpolate3D(v1, v2, v3, v4, v5, v6, v7, v8, float x, float y, float z)
{
    float s = interpolate2D(v1, v2, v3, v4, x, y);
    float t = interpolate2D(v5, v6, v7, v8, x, y);
    return interpolate1D(s, t, z);
}

Сравните это с interpolate2D():

  • интерполировать дважды по "нижнему измерению" (1D для 2D, 2D для 1D), используя те же переменные (x для 1D, (x, y) для 2D)
  • интерполировать промежуточные результаты 1D, используя оставшуюся переменную (y для 2D, z для 3D)

Также обратите внимание - мы не знаем, как вы разместите свои версии от v1 до v8. Но если вы сделаете это правильно, эта функция будет работать.

Линейная интерполяция не работает на гранях (не у каждого гиперкуба есть грани). Работает на вершинах, парами.

Вы можете думать, что nD-интерполяция состоит из двух частей:

  1. Серия одномерных интерполяций на парах входных вершин.
  2. (n-1)D интерполяция на интерполированные значения из первой части.

Например, 2D-интерполяция - это 1D-интерполяция на 2 парах входных вершин с последующей 1D-интерполяцией на 2-х результатах. Трехмерная интерполяция - это одномерная интерполяция на 4 парах входных вершин с последующей двухмерной интерполяцией на 4 результата. 4D-интерполяция - это 1D-интерполяция на 8 парах входных вершин с последующей 3D-интерполяцией на 8 результатах.

По сути, первая часть сводит проблему интерполяции с nD к эквивалентной (n-1)D проблеме интерполяции; вторая часть выполняет эту интерполяцию.

Очень хороший источник для понимания трилинейной интерполяции можно найти по адресу: https://en.wikipedia.org/wiki/Trilinear_interpolation

Упоминается следующее:

На практике трилинейная интерполяция идентична двум билинейным интерполяциям в сочетании с линейной интерполяцией:

C = linear(bilinear(C_(000),C_(010),C_(100),C_(110)),
           bilinear(C_(001),C_(011),C_(101),C_(111)))
Другие вопросы по тегам