У меня есть плоская треугольница Делоне, состоящая из около 1 миллиона треугольников. Каждая вершина помечена несколькими скалярными метриками [1], и я хотел бы увидеть быструю и простую интерполяцию каждой из этих показателей в одной и той же регулярной сетке. Для справки, объединение моих треугольников охватывает около 10 миллионов ячеек сетки, имеющих (целочисленные) координаты. [2]Билинейная интерполяция по целочисленным координатам в триангуляции Деланея
Когда я говорю просто, я имею в виду простой. Билинейный - это прекрасно! Я понимаю, что это (а) в основном то, что делают графические процессоры для жизни, и (б) вероятно, тема бесчисленных домашних заданий. Я сам являюсь правительственным исследователем в области общественного здравоохранения, поэтому для меня это не домашнее задание. :-)
В моей медленной, но правильной эталонной реализации, можно вычислить следующие примерно за 10 минут:
для каждого треугольника Т:
- Множество О всех (целое число) декартовых координатах в ограничивающей рамке T;
- Барицентрические координаты (u, v, w) для каждого (x, y) в G;
- Отклонение (u, v, w), которое не все положительно, т. Е. Внутри T;
- Весовая сумма (u z_1 + v z_2 + w * z_3) для каждой оставшейся координаты в T, где z_1, z_2 и z_3 для данной метрики [1] являются скалярными значениями в вершинах T.
Мне действительно нужны шаги 1-3, чтобы быть быстрыми; шаг 4 тривиален, но это моя конечная цель. В идеале решение может принимать одну из следующих форм:
- Лицензированная (GPL в порядке) библиотека с простыми API; или
- Объяснение этого достаточно ясно, что это очевидно, как промежуточный программист может написать код в Fortran, R, Python или C.
Классическая формулировка этой задачи является «ТИН в DEM» местности -модулировать работу. Но кажется, что в наши дни обратное более часто необходимо (?)
Некоторая базовая очистка, например удаление дубликатов, когда точка попадает точно на ребро или вершину, разделяемую двумя + треугольниками, тоже в порядке.
Большое спасибо заранее за ваше время и внимание. Я очищу форматирование и отредактирую каждое предложение, как только я уйду с поезда!
Сноска:
[1] Высота, температура, и влажность. [2] Целые числа в том смысле, что они расположены на расстоянии 20x20 м друг от друга на сетке UTM. Так что просто масштабируйте на 20.
Быстрые вопросы: Какая точность вам нужна для вывода и, если она не чрезмерна, вы можете использовать, скажем, OpenGL/OpenGL-ES на графическом процессоре? Как вы говорите, это именно то, что делают GPU (и делают это чрезвычайно быстро). –
Мне нужна точность около 1% (может быть 0,1%) от полной шкалы каждой метрики. Так, например, если метрика «z» была температурой, и они варьировались от 0 до 100 C по всему домену, тогда мне нужны только интерполяции z с точностью около 1,0 или, возможно, 0,1 C. Многие треугольники будут «плоскими» ", имеющие вершины, все они очень близки к одному и тому же z. Я попытался создать триангуляцию таким образом, чтобы градиент был достаточно гладким - то есть, когда я ожидаю, что градиент будет крутым, я создал более тонкую сетку. Я мог бы построить гистограмму диапазона z по размеру треугольника ...? – dholstius
Это выглядит многообещающим, за исключением того, что у меня уже есть триангуляция Delaunay, которую я хочу использовать: http://rncarpio.github.io/delaunay_linterp/ – dholstius