Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Интерполяция поверхности


Автор: Zakhar_Shan 22.12.2012, 14:39
Задача вот какая. 
В пространстве дано куча точек, располагаются черт зная как на разном расстоянии друг от друга. 
Необходимо выполнить интерполяцию, чтоб обрисовать карту (содержащею значение поверхности на регулярной сетки) и выгрузить ее в специальный формат.
У нас смеются спец. ПО, которая делает это. Позволяет использовать много алгоритмов (Global B-Spline, Local B-Spline,Converging average...), но о них кроме формул, я ничего не найду, а если и находится, то алгоритмы только для функции одной переменной. Бикубическая интерполяция дает результат только в случае одинокого шага всех точек по сетки...
У кого есть может готовые алгоритмы, без кучи формул, а то долго возиться не хочется...

Автор: W4FhLF 22.12.2012, 21:18
http://www.alglib.net/interpolation/

Автор: tzirechnoy 22.12.2012, 21:47
1) Без формул -- никак, это вполне себе нетривиальная задача.
2) Кстати, в OpenGL этого тожэ нет.
3) Самое мне подходящее что я пока что видел из этого разряде -- http://sweb.cz/M.Dressler/ABOS.htm, реализованный в http://surgeweb.sweb.cz/surgemain.htm. Но исходников не дают (почему-то), только описание, по которому, впрочем, вполне реально реализовать.
Но там есть довольно много ссылок, в т.ч. и на OpenSource утилиты, и на приличное введение в проблемы.
4) Для начала попробовать и что-нибудь простое. Например, присвоить каждой точке данных в каждой точке сетки вес, в зависимости от расстояния между точкой сетки и точкой данных. Уменьшающийся с расстоянием вес, разумеется. Удобно -- нелинейно уменьшающийся (ну, там пропорцыонально минус второй-третьей степени расстояния).
И затем взять среднее значение в данной точке сетки с учётом весов (т.е. сумма по всем точкам данных вес*значение, и поделить на сумму весов). Для более-менее гладких и нечастых данных нормально работает. 

Автор: baldina 22.12.2012, 23:00
Цитата(Zakhar_Shan @  22.12.2012,  14:39 Найти цитируемый пост)
дано куча точек

Цитата(Zakhar_Shan @  22.12.2012,  14:39 Найти цитируемый пост)
выполнить интерполяцию, чтоб обрисовать карту

если точки определяют рельеф, то скорее всего вам нужна триангуляция. готовых реализаций так много, что https://www.google.ru/search?q=delaunay+triangulationбудет достаточно.
при желании на триангуляцию можно наложить регулярную сетку.

Автор: Zakhar_Shan 24.12.2012, 08:17
Цитата

http://www.alglib.net/interpolation/

Читал, только все там для функции одной переменной, а у меня x,y,z ....
Цитата

1) Без формул -- никак, это вполне себе нетривиальная задача.
2) Кстати, в OpenGL этого тожэ нет.
3) Самое мне подходящее что я пока что видел из этого разряде -- ABOS, реализованный в SurGE. Но исходников не дают (почему-то), только описание, по которому, впрочем, вполне реально реализовать.
Но там есть довольно много ссылок, в т.ч. и на OpenSource утилиты, и на приличное введение в проблемы.
4) Для начала попробовать и что-нибудь простое. Например, присвоить каждой точке данных в каждой точке сетки вес, в зависимости от расстояния между точкой сетки и точкой данных. Уменьшающийся с расстоянием вес, разумеется. Удобно -- нелинейно уменьшающийся (ну, там пропорцыонально минус второй-третьей степени расстояния).
И затем взять среднее значение в данной точке сетки с учётом весов (т.е. сумма по всем точкам данных вес*значение, и поделить на сумму весов). Для более-менее гладких и нечастых данных нормально работает. 

1) Да ни то что бы совсем без формул, просто библиотеку хочется простенькую...
2)Жаль, думал как ни будь соберусь, изучу и все мне по плечу будет....
3) Спасибо, почитаю:)
4)Это линейная интерполяция, ее тоже нашел, но вот она не гладкая совсем smile 
Цитата

...если точки определяют рельеф....

Не совсем рельеф, но что-то сходное есть, спасибо, почитаю:)

Автор: baldina 24.12.2012, 10:27
Цитата(Zakhar_Shan @  24.12.2012,  08:17 Найти цитируемый пост)
4)Это линейная интерполяция, ее тоже нашел, но вот она не гладкая совсем

от первой до второй один шаг. линейная определяется по двум точкам полиномом первой степени. квадратичная - по трем точкам полиномом второй степени и т.д.
если точки интерполировать регулярной сеткой (любым подходящим способом), на регулярной сетке можно строить поверхности желаемой гладкости (NURBS например)

Автор: Alexeis 24.12.2012, 11:26
Бикубик, насколько я знаю, делается по 4м точкам. При помощи метода наименьших квадратов строиться парабола наилучшим образом проходящая через 4 точки. Искомая же точка должна находиться между 2й и 3й точками (счет от единицы). Подставляем координаты Х в уравнение параболы и получаем Y .
 Для случая 3D сначала ведется интерполяция в одной плоскости (например XZ), затем второй (YZ) . Если же это задача графики, то интерполировать нужно не только координаты, но и нормали каждой точки. В принципе, нормаль ни чем от координат не отличается. 

Автор: tzirechnoy 24.12.2012, 17:39
Цитата
Читал, только все там для функции одной переменной, а у меня x,y,z ....


Ну, RBF по приведённой ссылке -- из того, что надо. Это последний раздел как раз. Если нужна гладкость -- то как раз, медленно, зато вполне гладко. Но шумы по-моему будут валить сходимость.

Добавлено через 2 минуты и 1 секунду
Цитата
3) Спасибо, почитаю:)


Кстати, про почитаю -- исходников-то не дают, а бинарники -- пожалуйста. Так что можно сравнительно быстро проверить, подойдёт ли этот метод.
Впрочем, если вещь не особенно отчуждаемая (не будет стоять вопросов про копирайты) -- то сравнительно просто surgef.exe использовать в своей программе. Подготовил файл с точками, запустил, получил выходной grid.

Добавлено через 3 минуты и 36 секунд
Цитата
если точки интерполировать регулярной сеткой (любым подходящим способом),


Вы, видимо, не заметили -- но топикстартер как раз и спрашывает, как точки интэрполировать регулярной сеткой.

Автор: baldina 24.12.2012, 17:52
Цитата(tzirechnoy @  24.12.2012,  17:39 Найти цитируемый пост)
Вы, видимо, не заметили -- но топикстартер как раз и спрашывает, как точки интэрполировать регулярной сеткой. 

нэмного заметил ;) речь о том, что для регулярной может быть использована нерегулярная (если например её заведомо проще строить) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)