Подгонка несортированных точек кривой на плоскости

Вопрос: Как подобрать кривую к точкам на плоскости, если они не однозначны?

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

Matlab был бы предпочтительнее, но псевдокод подойдет. Или указатель на правильную терминологию для этой проблемы было бы замечательно.

Спасибо


person tkw954    schedule 14.06.2009    source источник
comment
Что бы вы хотели получить в результате? Это одно уравнение? Или шлицы? Или что-то другое?   -  person Igor Krivokon    schedule 15.06.2009
comment
Лучше всего было бы одно уравнение (точнее: два x = f (t) y = f (t)), хотя кусочные уравнения тоже подходят.   -  person tkw954    schedule 15.06.2009


Ответы (7)


Ваши данные выглядят как двумерный параметрический график (x,y) как функции некоторого базового параметра t. Таким образом, можно выполнить подгонку методом наименьших квадратов x(t) и y(t), если сможете придумайте для них разумную модель. Похоже, ваши данные описывают лимакон.

person las3rjock    schedule 15.06.2009
comment
Хотя показанные данные действительно имеют основную кривую (функцию розы), это было просто потому, что построить график было легко. Мне нужно подогнать кривую к любым произвольным данным. - person tkw954; 15.06.2009
comment
Вы должны кое-что знать об основных данных, чтобы подобрать любую полезную кривую. В приведенном выше примере нет особой причины (для наивного алгоритма) идти прямо на перекрестке, а не делать два крутых поворота направо. Вы можете подогнать любую кривую к любому набору точек, это просто становится вопросом пригодности. Вам нужна эвристика, чтобы выбрать кривую, которую вы собираетесь использовать, тогда любая стандартная процедура минимизации ошибок подгонит кривую к точкам. - person Mark Bessey; 15.06.2009
comment
Я думаю, что если вы включите термин регуляризации (например, минимизацию кривизны), он устранит двусмысленность на пересечении. - person tkw954; 15.06.2009

Изменить: nvm неверно истолковал вопрос. Я все равно оставлю этот ответ здесь.

Может быть, сначала попробуйте найти выпуклую оболочку точек, а затем подогнать выпуклую оболочку на плоскости

http://www.cse.unsw.edu.au/~lambert/java/3d/giftwrap.html ‹- включает java-анимацию реализации http://en.wikipedia.org/wiki/Convex_hull_algorithms

Если вам не нужна эффективность, есть несколько очень простых реализаций, таких как версия подарочной упаковки, которая O (n ^ 2) http://en.wikipedia.org/wiki/Gift_wrapping_algorithm

Версия "разделяй и властвуй" - O (nlogn)

person Charles Ma    schedule 15.06.2009

вы можете попытаться определить порядок точек, а затем применить сплайновые процедуры. конечно, существует двусмысленность там, где кривая пересекает саму себя.

возможно, наиболее наивным подходом было бы вычислить триангуляцию Делоне (время без учета времени), исходя из которой аппроксимируют евклидов гамильтонов цикл минимального расстояния через точки. Вам все равно придется выяснить, где находятся «концы». После этого вы сможете применить технику сплайнов. Для справки см. Поиск гамильтоновых циклов в триангуляции Делоне является NP- Complete, или статью Райнельта об эвристике TSP, 1992 г., или EMST в Википедии

hth,

person shabbychef    schedule 28.08.2009

Для кусочных аппроксимаций с использованием B-сплайнов вы можете использовать этот пакет Matlab. Работает в автоматическом и полуручном режимах.

person Eugene Katrukha    schedule 11.10.2016

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

person Jason    schedule 16.11.2018

Вам придется делать несколько кусочков или шлицев. Не ожидайте, что какой-либо алгоритм сможет сделать все за один раз. Может быть как минимум три дуги: первая до перекрестка, петля, а затем назад от перекрестка вперед.

person duffymo    schedule 14.06.2009

Эта проблема действительно сложна, если у вас нет заказа. Выполнить метод наименьших квадратов для некоторых (x (t), y (t)) легко - если вы знаете порядок t.

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

person Ray    schedule 16.06.2009