Трилинейная интерполяция
Поэтому я пытаюсь написать функцию трилинейной интерполяции, но у меня возникли проблемы с ее созданием.
Итак, сначала у нас есть 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-интерполяция состоит из двух частей:
- Серия одномерных интерполяций на парах входных вершин.
- (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)))